Правила программирования на Си и Си++


         

указывает на таблицу производного класса.


указывает на таблицу производного класса. После присваивания указатель vtable
указывает на таблицу базового класса; он был переинициализирован неявным вызовом конструктора при вызове new в перегруженной операции operator=().
Таким образом, вызовы конструкторов в операции operator=()
просто не будут работать, если есть таблица виртуальных функций. Так как вы можете знать или не знать, на что похожи определения вашего базового класса, то вы должны исходить из того, что таблица виртуальных функций имеется, и поэтому не вызывайте конструкторов.
Лучшим способом устранения дублирования кода в операции присваивания operator=()
является использование простой вспомогательной функции:
class some_class
{
   void create  ( void                );
   void create  ( const some_class &r );
   void destroy ( void                );
public:
   virtual
      ~some_class( void
) { destroy(); }
       some_class( void
) { create();  }
   const some_class &operator=( const some_class &r );
};
inline const some_class &some_class::operator=( const
some_class &r )
{
   destroy();
   create( r );
}
inline some_class::some_class( void )
{
   create();
}
~some_class::some_class( void )
{
   destroy();
}
Часть 8е. Перегрузка операций

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий