【发布时间】:2013-10-01 09:21:16
【问题描述】:
假设我们得到了一个菱形继承,其中 D 继承自 B1 和 B2,其基数为 V,如下所示:
struct V {
V(){cout << "V()" << endl;}
V(int){cout << "V(int)" << endl;}
};
struct B1 : virtual V {
B1(){cout << "B1()" << endl;}
B1(int i): V(i) {cout << "B1(int)" << endl;
/*…*/ }
};
struct B2 : virtual V {
B2(){cout << "B2()" << endl;}
B2(int i) { cout << "B2()" << endl; }
};
struct D : B1, B2 {
D(int i): V(i) { cout << "D(int)" << endl; }
};
当我初始化 D* 参数时,我希望 B1 和 B2 默认构造函数调用 V 构造函数。但是,当我运行下一行时, V 被调用了一次。为什么?
D* d = new D(1);
提前致谢。
【问题讨论】:
-
简而言之:虚拟基类由最派生类的构造函数初始化。
-
这正是虚拟继承的用途。如果您确实想要两个不同的
V子对象,请不要使用虚拟继承。
标签: c++ inheritance diamond-problem