c++ - C++中的继承构造函数

标签 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。有人可以帮助我吗?了解发生了什么?为什么调用虚拟继承默认构造函数?

最佳答案

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

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

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

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

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

关于c++ - C++中的继承构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740854/

相关文章:

c++ - 无法从另一个对象调用成员函数

c++ - 如何从给定键的 interval_maps 中获取值?

c++ - 如何实现这个程序

c++ - 适用于 Windows 的 riscv-gcc

c++ - 调用虚函数的覆盖导致段错误

c++ - MI 和隐式复制构造函数错误(原为 : Under what conditions can a template be the copy constructor?)

python - 在同一台机器上安装不同版本的 Python 和 Anaconda

python - 用 Python 模拟操纵杆

java和多重继承

scala - 在Scala多重继承中,如何解决签名相同但返回类型不同的冲突方法?