C++ 虚拟继承基构造函数消除 结构A3{ int x; A3(int x_uux):x(x_uux{cout

C++ 虚拟继承基构造函数消除 结构A3{ int x; A3(int x_uux):x(x_uux{cout,c++,C++,实际上在本例中只创建了A3的一个实例,因此是的,我们只能从D3隐式调用A3的构造函数,但在后台,编译器可以以任何方便的方式执行它 如何消除工作 这是一个实现细节,但通常由编译器为一个类型发出两个不同的构造函数来完成。一个构造函数用于基类类型,另一个用于派生最多的对象类型 当存在虚拟基时,c'tor的基类版本不包含对虚拟基c'tor的调用。而c'tor的最派生对象版本包含对虚拟基c'tor的调用 因为编译器知道在什么上下文中使用类型,所以它可以选择适当的c'tor来调用 这是否意味着我们只能从D3

实际上在本例中只创建了A3的一个实例,因此是的,我们只能从D3隐式调用A3的构造函数,但在后台,编译器可以以任何方便的方式执行它

如何消除工作

这是一个实现细节,但通常由编译器为一个类型发出两个不同的构造函数来完成。一个构造函数用于基类类型,另一个用于派生最多的对象类型

当存在虚拟基时,c'tor的基类版本不包含对虚拟基c'tor的调用。而c'tor的最派生对象版本包含对虚拟基c'tor的调用

因为编译器知道在什么上下文中使用类型,所以它可以选择适当的c'tor来调用

这是否意味着我们只能从D3调用A3的构造函数

我们只能从最派生的对象类型调用它。如果该类型是
D3
,那么这是唯一将调用
A3
的对象类型

struct A3 {
    int x;
    A3(int x_): x(x_) {cout << "A3: " << x_  << endl;}
};
struct B3: virtual public A3 {
    B3(int x_): A3(x_) {cout << "B3: " << x_  << endl;}
};
struct C3: virtual public A3 {
    C3(int x_): A3(x_) {cout << "C3: " << x_  << endl;}
};
struct D3: B3, C3 {

    D3(int x_): A3(x_), B3(x_), C3(x_) {cout << "D3: " << x_  << endl;}
};