Re: Чеширский кот и изменение наследника до конструктора
От: crable США  
Дата: 02.09.05 05:18
Оценка:
_W>Можно так, менять поля наследника до вызова контруктора? Нужно в наследнике создать битовый массив признаков из тех, от кого он отнаследован.

_W>
_W>template <class Derived>
_W>class Base1
_W>{
_W>public:
_W>  Base()
_W>  {
_W>     static_cast<Derived*>(this)->type_tag = 1;
_W>  }
_W>};

_W>class Derived: public Base<Derived>
_W>{
_W>public:
_W>  int type_tag;
_W>};
_W>


При вызове конструктора базового класса объект Derived еще не существует и обращение к его полям противоречит стандарту. Хотя этот код выполнится без всяких проблем, после завершения конструктора Base, сработает конструктор по умолчанию для Derived и, соответсвенно, конструктор по умолчанию для type_tag, после которого он будет равен 0.

Можно попробовать написать свой конструктор для Derived и не инициализировать type_tag:

// Грязный хак:

// код для Base

class Derived: public Base<Derived>
{
public:
  Derived() {} // отсутсвует инициализация type_tag;

  int type_tag;
};
The last good thing written in C was Franz Schubert's Symphony No. 9.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.