默认构造函数和虚拟继承

时间:2010-08-19 16:39:31

标签: c++

是否可以为不提供默认构造函数的类提供虚拟继承?

目前的钻石图(最简单的一个,没有提供默认构造函数)只编译(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) {}
};

谢谢, 弗朗西斯

4 个答案:

答案 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) {}