Здравствуйте, товарищи!
...
то полями нового нового класса CRBTree будут являться указатели Parent,Left,Right на базовый класс CTRee.(А хочется, чтобы были указатели на производный класс).
Вопрос к крутым программистам: "Как быть? Неужели придется переписывать класс заново?"
Физически в производном классе унаследованные от базового указатели будут указывать на экземпляры производного.
Просто им надо подсказать. :)
Пусть:
Код:
class CBaseClass {
public:
CBaseClass * parent;
};
class CDerivedClass : public CBaseClass {
public:
int AnotherField;
};
Тогда без проблем:
Код:
CDerivedClass dc1;
CDerivedClass dc2;
dc1.parent = &dc2;
А чтобы достучаться до свойств производного класса из указателя на базовый, нужно явно указать этот базовый (ибо от базовго наследоваться может несколько классов )
Код:
CDerivedClass dc1;
CDerivedClass dc2;
dc1.parent = &dc2;
dc1.AnotherField = 1;
dc2.AnotherField = 2;
((CDerivedClass *) dc1.parent)->AnotherField = 3;
std::cout << dc2.AnotherField << endl; // Будет выведено значение "3".
А чтобы не заниматься таким безобразием:
Код:
((CDerivedClass *) dc1.parent)->AnotherField = 3;
- доступ к полям класса следует делать делать с помощью виртуальных методов, которые в случае необходимости можно переопределить в производном классе.