【问题标题】:Why only base class default constructor is called in virtual base multiple inheritance? [duplicate]为什么在虚拟基多重继承中只调用基类默认构造函数? [复制]
【发布时间】:2013-06-24 10:42:16
【问题描述】:

在多重继承中,我有一个虚拟的Base 类,它由类A 和类B 继承。 ABAB 的基类。请看下面的代码。 在AB 的构造函数中,调用了Base(string) 构造函数。我期望得到以下输出:

Base::Base(std::string)

A::A()

B::B()

但我得到以下输出:

Base::Base()

A::A()

B::B()

为什么会调用Base 的默认构造函数?

#include<iostream>
#include<string>
using namespace std;

class Base{
public:
        Base(){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
        Base(string n):name(n){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
private:
string name;
};

class A : public virtual Base {
public:
        A():Base("A"){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
private:
string name;
};

class B : public virtual  Base {
public:
        B():Base("B"){
                cout<<__PRETTY_FUNCTION__<<endl;
        }
private:
string name;
};

class AB : public A, public B{

};

int main(){
        AB a;
}

【问题讨论】:

  • 因为虚基类的构造函数是从最派生类调用的。在您的示例中,您希望 Base::Base( std::string ) 收到什么参数?
  • 你正在寻找这个stackoverflow.com/questions/4384765/…
  • 这是有道理的。与在虚拟基类中一样,我们将只有一个共享对象,因此哪个类( A 或 B )应该构造它,因为它们将不同的字符串传递给构造函数。如果大多数派生类都在构造它,那就没有混淆。

标签: c++ multiple-inheritance


【解决方案1】:

虚拟基础由最衍生对象构成。所以AB的构造函数调用了Base的构造函数,但是由于你没有为AB指定构造函数,所以它的默认构造函数只是调用了Base的默认构造函数。

您可以像这样从AB 调用字符串构造函数:

struct AB : A, B
{
    AB() : Base("hello"), A(), B() { }
};

请注意,构造函数A::A()B:B() 在此设置中调用Base 构造函数!

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2018-03-28
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2012-05-19
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多