是否可以为不提供默认构造函数的类提供虚拟继承?
目前的钻石图(最简单的一个,没有提供默认构造函数)只编译(g ++ 4.4.3)。
class A {
public:
A(int ) {}
};
class B : virtual public A {
public:
B(int i) : A(i) {}
};
class C : virtual public A {
public:
C(int i) : A(i) {}
};
class D : public B, public C {
public:
D(int i) : B(i), C(i) {}
};
谢谢, 弗朗西斯
答案 0 :(得分:22)
你需要在这里明确地调用A
的构造函数
D(int i) : A(i), B(i), C(i) {}
虚拟基类的特殊之处在于它们由最派生的类初始化,而不是由从虚拟基础继承的任何中间基类初始化。哪个潜在的多个初始值设定项可以正确选择初始化一个基数?
如果构造的派生类最多没有在其成员初始化列表中列出,则使用默认构造函数初始化虚拟基类,该构造函数必须存在且可访问。
从here无耻地复制: - )
答案 1 :(得分:3)
我相信您的班级D
还需要在其初始化列表中明确调用A
的构造函数。
答案 2 :(得分:1)
Dr. Dobbs的文章Multiple Inheritance Considered Useful解释了解决这个问题的各种方法。建议基本上是提供默认构造函数和init()
方法。它为B和C增加了更多的工作,但是防止D必须知道A。
答案 3 :(得分:0)
你需要显式调用这样的构造函数:
D(int i) : A(i), B(i), C(i) {}