在整个继承链中复制构造
Copy construction throughout inheritance chain
不应该在整个继承链中使用复制构造函数吗?
#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";}
以确保调用基类的复制构造函数。
相关文章:
- 使用智能指针附加的继承对象的深层复制
- 在继承层次结构中复制和移动
- 使用继承的指针列表复制构造函数或重载运算符=
- 多复制构造函数继承中的惊人行为
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- C++17 中复制构造函数的继承
- 在整个继承链中复制构造
- C++ 默认构造函数在移动和复制构造函数存在时不随"using"继承
- 复制构造函数无法识别继承的成员
- 使用 "using" 关键字继承基类的复制和移动构造函数
- 是否应在调用基本CTOR时复制继承的构造函数
- 如何调用所有基本类的复制构造函数,以在C 中复制钻石继承中最派生的类对象
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 从C++中的基类继承复制/移动构造函数作为构造函数
- C++14 不能调用从唯一指针继承的类的复制构造函数或运算符 =
- 构造函数尝试调用复制构造函数,虚拟继承
- 在派生类构造函数中复制继承的成员有效吗
- 如何从基类指针复制继承的类而不进行拼接
- 我可以用重载复制继承吗?