#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。为什么要运行普通的构造函数而不是A类的复制构造函数呢?
答案 0 :(得分:4)
您的代码会复制D
的实例,并调用其副本构造函数。
您的类D
的副本构造函数仅调用其C
和B
的超类的副本构造函数。因为它不调用A
的副本构造函数,所以它是默认构造的。
虚拟继承的类可以被认为是派生最多的类的直接超类。这就是虚拟继承的含义。因此,在您的D
实例中,其虚拟继承的A
是D
的直接超类,而不是B
或C
的超类;因此, 不 会调用B
和C
对A
复制构造函数的调用。
当您拥有一个虚拟继承的类时,您的所有构造函数实际上都在“幕后”创建了两个版本:一个负责构造任何虚拟继承的类,一个不是。 not 不会的那个调用虚拟继承的类的构造函数。