наследования указателя

Наследование указателя (члена класса предка) - это мы попытались обозвать то, что хотели бы сделать.

Композиция, агрегация и наследование - красивые слова, но для нас важна практика.

Композиция это просто набор объектов внутри какого-то  класса, которые принадлежат этому классу и вне его не существуют. Агрегация то же самое, но объект может существовать и вне или принадлежать нескольким классам и т.д.

И у этого класса есть предок, у которого своя композиция, свой набор объектов.

Сегодня пришла идея проверить наследования агрегации

Давайте проверим не сошли ли мы с ума.

Класс Dlg2 наследуется от класса Dlg1.

Класс АА наследник класса А.

Так вот в классе Dlg1 есть указатель на класс А.. В классе Dlg2 нет своего указателя на класс АА, но Dlg2 наследует указатель aна класс A по предку Dlg1.

На практике было бы удобно выбирать между используемым функционалом либо работать с классом Dlg2 &  AA, либо Dlg1 & A.

Короче идея реализована на возможности создать два или более конструкторов для класса А и если мы создаем объект класса Dlg1 вызывать первый конструктор, а когда мы создаем объект класса Dlg2 вызывать второй конструктор класса А.

И что получится?

#include 
#include 

class A
{
public:
    A()
    {
        qDebug("ctor A");
    }
public:

    virtual void vrt_A()
    {
        qDebug("A::vrt_A()");
    }

};

class AA: public A
{
public:
    AA() : A()
    {
        qDebug("ctor AA");
    }

    virtual void vrt_A()
    {
        qDebug("AA::vrt_A()");
    }

};

class Dlg1
{
public:
    Dlg1()
    {
        qDebug("ctor Dlg1");

        a = new A();
    }

    A *a;

protected:

    Dlg1(A* a_) : a(a_) // important : dont remember a(a_)
    {
        qDebug("protected ctor Dlg1");
    }
};

class Dlg2: public Dlg1
{
public:
    Dlg2():Dlg1( new AA() ) // this is important !
    {
        qDebug("ctor Dlg2");
    }

    void foo()
    {
        qDebug("foo");
    }

};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //Dlg2 * dlg = new Dlg2();
    //dlg->foo();

    Dlg2 dlg;
    dlg.a->vrt_A();

/*
    ctor A
    ctor AA
    protected ctor Dlg1
    ctor Dlg2
    AA::vrt_A()
*/

    return a.exec();
}

Получается как раз то, что надо. Работаем с классом Dlg1 - срабатывают функции класса A (vrt_A()), когда работаем с  классом Dlg2 срабатывают функции класса AA (тоже vrt_A()). Чего еще надо?

Файлы для скачивания