继承中的 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
的复制构造函数仅调用其 C
和 B
的超 class 的复制构造函数。因为它不调用 A
的复制构造函数,所以它是默认构造的。
虚拟继承的 classes 可以被认为是最派生的 class 的直接超classes。这就是虚拟继承的意思。因此,在您的 D
实例中,它的虚拟继承 A
是 D
的直接超 class,而不是 B
或 [=12] =];因此,B
和 C
对 A
复制构造函数的调用是 而不是 调用。
当你有一个虚拟继承的 class 时,你所有的构造函数实际上都创建了两个版本 "behind the scenes":一个负责构建任何虚拟继承的 classes,一个那不是。不是 not 调用虚拟继承的 classes 的构造函数。
#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
的复制构造函数仅调用其 C
和 B
的超 class 的复制构造函数。因为它不调用 A
的复制构造函数,所以它是默认构造的。
虚拟继承的 classes 可以被认为是最派生的 class 的直接超classes。这就是虚拟继承的意思。因此,在您的 D
实例中,它的虚拟继承 A
是 D
的直接超 class,而不是 B
或 [=12] =];因此,B
和 C
对 A
复制构造函数的调用是 而不是 调用。
当你有一个虚拟继承的 class 时,你所有的构造函数实际上都创建了两个版本 "behind the scenes":一个负责构建任何虚拟继承的 classes,一个那不是。不是 not 调用虚拟继承的 classes 的构造函数。