Как создать наследуемый класс так, чтобы
а) наследуемый получил доступ к инициализированным структурам и членам родительского класса и
б) базовый класс создал бы наследуемый и сохранил бы указатель на него у себя в private?
идеально было бы:
class CBase{
public:
CBase();
void Func();
private:
CDerived *pDerived;
};
и
class CDerived: public CBase{
public:
CDerived();
};
и создать наследуемый класс в функции CBase::Func(){pDerived = new CDerived;...}
Но такая конструкция не компилится, поскольку оба класса ссылаются друг на друга при объявлении.
И как сделать так, чтобы вновь созданный наследуемый класс имел доступ к инициализированным данным базового, или это невозможно?
Честно говоря, у меня создается ощущение, что ты неправильно используешь наследование. Ты уверен, что твой случай требует именно _наследования_?
Быстрое решение такое: перед определением class CBase ставишь строчку
class CDerived;
Все. НО! Советую трижды подумать перед тем, как это делать. У тебя базовый класс завязан на производный - это не слишком хорошая идея. Не имеет ли смысла перепроектировать иерархию так, чтобы зависимости шли только в одну сторону (т.е. чтобы ссылки шли либо на свой класс, либо на свои базовые классы)?
> И как сделать так, чтобы вновь созданный наследуемый класс > имел доступ к инициализированным данным базового, или это > невозможно? Классы в С++ _не создаются_. В С++ создаются объекты. Разница, надеюсь, понятна? Теоретически сделать это можно, но я даже не буду рассказывать как, пока ты не убедишь меня, что это действительно единственный выход из положения.
[C++] Поддерживаю20.02.03 19:17 Автор: amirul <Serge> Статус: The Elderman
> Все. НО! Советую трижды подумать перед тем, как это делать. > У тебя базовый класс завязан на производный - это не > слишком хорошая идея. Не имеет ли смысла перепроектировать > иерархию так, чтобы зависимости шли только в одну сторону > (т.е. чтобы ссылки шли либо на свой класс, либо на свои > базовые классы)? Не должны базовые классы знать о производных. Даже изменение protected-членов из виртуальных функций есть очень плохо, а уж тем более хранение указателя на производный в базовом
> Классы в С++ _не создаются_. В С++ создаются объекты. Иногда создаются (инстанцируются :-))) ), но это другая история
> Разница, надеюсь, понятна? Теоретически сделать это можно, > но я даже не буду рассказывать как, пока ты не убедишь > меня, что это действительно единственный выход из > положения. Я тоже не верю, что это МОЖЕТ понадобиться
[C++] Не в тему...21.02.03 11:38 Автор: Green Статус: Незарегистрированный пользователь
> Последняя модная фишка - вообще, не создавать екземпляров > класса (объектов), а делать всё в статике. В частности, для абстрактных классов на этапе компиляции не всегда известна не только потребность в конкретном объекте, но даже и его тип. Здесь уж как ни изворачивайся, а статически его создать не получится :-)