在C ++中继承构造函数

时间:2013-09-11 12:11:52

标签: c++ virtual multiple-inheritance

C ++ 11标准提供了一种从基类继承构造函数的方法。我的问题是关于早期的标准。假设我以下列方式继承构造函数:

class Base {

public: 
  Base() {};
  Base(int b) { a = ++b;}
  virtual int foo() {return 0;}
  int a;

};

class A : public virtual Base {

public: 
  A() {}
  A(int b): Base(b) {} 
  int foo() {return a*a;}

};

class C : public A {
public: 
  C() {}
  C(int b ): A(b) {}
  int foo() { return (a*a + a);}

};

请注意,我正在使用Base类的虚拟继承。现在,当我尝试初始化指向C类型对象的指针时,代码不再调用Base(b)构造函数,代码最终调用Base()构造函数。这是我使用的主要功能:

int main(){

  C *c = new C(5); 
  std::cout << c->Base::a << std::endl;
}

“a”的输出值为0.但是,当我继承Base类时删除virtual关键字,然后调用Base(b)构造函数并且“a”的值为6.有人可以帮助我了解发生了什么?为什么使用虚拟继承默认构造函数被调用?

1 个答案:

答案 0 :(得分:6)

基于派生类的构造函数的成员初始化列表初始化虚拟基类。

在您的情况下,当您创建C的实例时,将根据Base的构造函数中的成员初始化列表初始化其C子对象;由于Base未列在那里,因此将默认初始化。

如果您要创建A的实例,那么确实会使用A的成员初始化列表。

所以要调用你想要的Base构造函数,你必须像这样修改C的构造函数:

C(int b ): A(b), Base(b) {}