了解如何在多重继承中初始化构造函数

时间:2019-07-06 10:59:59

标签: c++ constructor multiple-inheritance virtual-inheritance ctor-initializer

我很难解决这类问题。在几天后的一次考试中,他们展示了C++中具有多重继承的程序:

struct X {
    X(){cout << "X" << endl;}
};

struct A : virtual X {
    int i;
    A(){cout << "A" << endl;}
};

struct B : A {
    int i;
    B(){cout << "B" << endl;}
    virtual void f() {cout << "f" << endl;}
};

struct C : A {
    int i;
    C(){cout << "C" << endl;}
    C(int i){cout << "C2" << endl;}
    virtual void g() {cout << "g" << endl;}
};

struct D : virtual B, virtual C {
    int i;
    D( int i) : C(i), B() {cout << "D" << endl;}
};

并显示main中的一些代码:

D* d = new D(2014);
C* c = d;
B* b = d;

然后问“输出是什么?”我不需要解决方案,我总是可以  只是运行或调试它,但我需要了解直觉,因为我不会在考试中随身携带调试器。现在我知道我需要遵循的算法:

  

5初始化应按以下顺序进行:

     

-首先,并且仅对于最派生类的构造函数为   如下所述,虚拟基类应在   以便它们出现在深度优先的从左到右的遍历中   基类的有向无环图,其中“从左到右”是   基类名称在派生类中的出现顺序   基本说明者列表。

     

—然后,直接基类应按声明顺序初始化   就像它们出现在基本说明符列表中一样(无论   内存初始化程序。)

     

-然后,应按非静态数据成员的顺序对其进行初始化   在类定义中声明(同样不管顺序如何)   内存初始化程序)。

     

-最后,执行构造函数的主体。 [注意:   宣布宣言的命令,以确保基地和成员   子对象以相反的初始化顺序销毁。 ]

但是我真的很难解决这些问题,这没有任何意义。是否有可能显示直觉,或者解决这些问题的技巧或窍门?也许显示出黑暗的角落?也许以某种方式写下了所有的类/结构,以某种方式编写了vbase类以便于输出。

0 个答案:

没有答案