【问题标题】:Inhereting constructors in C++ [duplicate]在 C++ 中继承构造函数 [重复]
【发布时间】:2013-09-11 12:11:51
【问题描述】:

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

【问题讨论】:

  • 谢谢胡安乔潘萨。是的,该线程确实是同一主题。

标签: c++ virtual multiple-inheritance


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 2015-03-24
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2021-06-30
    • 2020-01-01
    • 2011-05-31
    相关资源
    最近更新 更多