我不明白复制顺序在类层次结构中的工作原理
此代码:
class Base
{
protected:
void myBaseMethod()
{
cout << "basemethod";
}
Base() { cout << "default constructor - base"; }
~Base() { }
Base(Base& other)
{
cout << "copy constructor - base";
}
Base& operator= (Base const &)
{
cout << "assignment operator - base";
}
};
class Derived : private Base
{
public:
Derived()
{
cout << "default constructor - derived";
}
};
int main()
{
Derived eaObj;
Derived efu = eaObj;
return 0;
}
按预期输出“default constructor - base”“default constructor - derived”,然后输出“copy constructor - base”。
复制对象时会调用哪些复制构造函数?首先是基类,然后是派生类?如果他们是虚拟的怎么办?
答案 0 :(得分:7)
调用的复制构造函数是静态类型的
对象,在您的情况下,Derived
。编译器生成了副本
构造函数调用每个基数的副本构造函数,
因为你没有为Derived
提供复制构造函数,
这就是你的情况。
如果你定义了复制构造函数,则需要显式 称之为基地;否则,默认构造函数 将调用base。 (在少数情况下,这是什么 通缉。但通常不会。)
如果继承是虚拟的,那么虚拟的构造函数 从最派生的类中调用base。复制构造函数 像这里的任何其他构造函数一样工作:如果派生类最多 有一个编译器生成的复制构造函数,它会调用该副本 每个虚拟基础的构造函数;如果它有用户 定义了复制构造函数,由程序员来调用 复制基地的构造者。 (根据我的经验,这很少见 对于虚拟基础包含数据成员,所以复制 构造函数和默认构造函数都做同样的事情。)
答案 1 :(得分:4)
复制对象时会调用哪些复制构造函数?首先是基类,然后是派生类?如果他们是虚拟的怎么办?
在您的情况下,调用Derived
的副本,因为您正在复制Derived
对象。但是,由于您没有定义该copy-ctor,编译器会为您生成一个。生成的copy-ctor复制Derived
对象的所有部分,包括其Base
子对象。这是你得到输出的地方。
构造函数在另一个之后不会被调用。在Base
的构造函数体输入之前,Derived
构造函数在<{1}}构造函数中的内部,在初始化列表中调用。这适用于所有构造函数,不仅适用于copy-ctors。如果您没有在Derived
构造函数的init列表中提到Base
部分,则Derived
的默认构造函数会被编译器隐式调用。
Wrt虚拟构造函数:C ++中没有虚构造函数。