我很难解决这类问题。在几天后的一次考试中,他们展示了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类以便于输出。