2

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() 构造函数,而不是调用 Base(b) 构造函数。这是我使用的主要功能:

int main(){

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

“a”的输出值为0。但是,当我在继承Base类时删除virtual关键字时,会调用Base(b)构造函数并且“a”的值为6。有人可以帮我理解什么是继续?为什么使用虚拟继承调用默认构造函数?

4

1 回答 1

6

虚拟基类根据最派生类的构造函数的成员初始化器列表进行初始化。

在您的情况下,当您创建 的实例时C,其Base子对象将根据 的构造函数中的成员初始化器列表进行初始化C;并且由于Base未在此处列出,因此它将被默认初始化。

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

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

C(int b ): A(b), Base(b) {}
于 2013-09-11T12:26:02.833 回答