继承中的 C++ 复制构造函数

C++ copy constructor in inheritance

#include<iostream>
using namespace std;
class A
{
public:
     A(){ cout <<"1";}
     A(const A &obj){cout <<"2";}
};

class B: virtual A
{
public:
    B(){cout <<"3";}
    B(const B & obj):A(obj){cout<<"4";}
};

class C: virtual A
{
public:
   C(){cout<<"5";}
   C(const C & obj):A(obj){cout <<"6";}
};

class D:B,C
{
public:
    D(){cout<<"7";}
    D(const D & obj):C(obj),B(obj){cout <<"8";}
};

int main()
{
   D d1;
   D d(d1);
}

我得到 13571468 作为输出。但我认为输出应该是 13572468。为什么普通构造函数是 运行 而不是 class A 的复制构造函数?

您的代码创建了 D 实例的副本,并调用其复制构造函数。

您的 class D 的复制构造函数仅调用其 CB 的超 class 的复制构造函数。因为它不调用 A 的复制构造函数,所以它是默认构造的。

虚拟继承的 classes 可以被认为是最派生的 class 的直接超classes。这就是虚拟继承的意思。因此,在您的 D 实例中,它的虚拟继承 AD 的直接超 class,而不是 B 或 [=12] =];因此,BCA 复制构造函数的调用是 而不是 调用。

当你有一个虚拟继承的 class 时,你所有的构造函数实际上都创建了两个版本 "behind the scenes":一个负责构建任何虚拟继承的 classes,一个那不是。不是 not 调用虚拟继承的 classes 的构造函数。