在整个继承链中复制构造

Copy construction throughout inheritance chain

本文关键字:复制 继承      更新时间:2023-10-16

不应该在整个继承链中使用复制构造函数吗?

#include<iostream>
using namespace std;
class A
{
public:
     A(){ cout <<"1";}
     A(const A &obj){ cout <<"2";}
};
class B: virtual public A
{
public:
    B(){cout <<"3";}
    B(const B & obj){cout<<"4";}
};
class C: virtual public A
{
public:
   C(){cout<<"5";}
   C(const C & obj){cout <<"6";}
};
class D:B,C
{
public:
    D(){cout<<"7";}
    D(const D & obj){cout <<"8";}
};
int main()
{
   D d1;
   D d(d1);
}

输出:

13571358

预期:

13572468

复制构造函数仅用于D,因为D复制构造函数不调用其基类的复制构造函数。

它应该声明为

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

除非我打错了什么。

A对象需要在此处进行复制构造,因为它是一个虚拟基类,它是在派生最多的类中构造的。

复制构造函数不会在整个继承链中使用吗?

如果您让编译器为您完成此操作,那将是这样。既然你自己定义了它,你需要做正确的事情。

D(const D & obj){cout <<"8";}

相当于:

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

您需要使用:

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

以确保调用基类的复制构造函数。