复制构造函数 - 是派生构造函数之前调用的基础吗?

时间:2013-07-08 09:00:18

标签: c++

我不明白复制顺序在类层次结构中的工作原理

此代码:

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”。

复制对象时会调用哪些复制构造函数?首先是基类,然后是派生类?如果他们是虚拟的怎么办?

2 个答案:

答案 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 ++中没有虚构造函数。