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

Why only base class default constructor is called in virtual base multiple inheritance?

本文关键字:调用 基类 默认 构造函数 虚拟 多重继承 为什么      更新时间:2023-10-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;
}

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

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

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

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