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

时间:2018-08-04 14:39:02

标签: c++ inheritance constructor copy-constructor virtual-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。为什么要运行普通的构造函数而不是A类的复制构造函数呢?

1 个答案:

答案 0 :(得分:4)

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

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

虚拟继承的类可以被认为是派生最多的类的直接超类。这就是虚拟继承的含义。因此,在您的D实例中,其虚拟继承的AD的直接超类,而不是BC的超类;因此, 会调用BCA复制构造函数的调用。

当您拥有一个虚拟继承的类时,您的所有构造函数实际上都在“幕后”创建了两个版本:一个负责构造任何虚拟继承的类,一个不是。 not 不会的那个调用虚拟继承的类的构造函数。