为什么在虚基多重继承中只调用基类默认构造函数?

时间:2013-06-24 10:42:17

标签: c++ multiple-inheritance

在多重继承中,我有一个虚拟的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;
}

1 个答案:

答案 0 :(得分:4)

虚拟基础由派生最多的对象构成。所以AB的构造函数调用Base构造函数,但由于你没有为AB指定构造函数,因此它的默认构造函数只调用Base的默认构造函数。 / p>

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

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

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