2

我不明白复制顺序如何在类层次结构中工作

这段代码:

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;
}

按预期输出“默认构造函数 - 基”“默认构造函数 - 派生”,然后输出“复制构造函数 - 基”。

复制对象时调用了哪些复制构造函数?首先是基类,然后是派生类?如果它们是虚拟的呢?

4

2 回答 2

7

调用的复制构造函数是对象的静态类型,在您的情况下,Derived. 编译器生成的复制构造函数调用每个基的复制构造函数,并且由于您没有为 提供复制构造函数Derived,这就是您的情况。

如果定义了复制构造函数,则需要显式调用基类的构造函数;否则,将调用基础的默认构造函数。(在极少数情况下,这是需要的。但通常不是。)

如果继承是虚拟的,则从最派生的类调用虚拟基的构造函数。复制构造函数在这里像任何其他构造函数一样工作:如果最派生类具有编译器生成的复制构造函数,它将调用每个虚拟基的复制构造函数;如果它具有用户定义的复制构造函数,则由程序员调用基的复制构造函数。(根据我的经验,虚拟基很少包含数据成员,因此复制构造函数和默认构造函数都做同样的事情。)

于 2013-07-08T09:07:27.830 回答
4

复制对象时调用了哪些复制构造函数?首先是基类,然后是派生类?如果它们是虚拟的呢?

在您的情况下,调用了 copy-ctor Derived,因为您正在复制一个Derived对象。但是,由于您没有定义该 copy-ctor,因此编译器会为您生成一个。生成的 copy-ctor 复制对象的所有部分Derived,包括其Base子对象。那是您从中获取输出的地方。

构造函数不会一个一个地被调用。构造函数在构造函数内部,在初始化列表中,在进入构造函数体之前Base被调用。这适用于所有构造函数,不仅适用于复制ctor。如果您没有在构造函数的 init 列表中提及该部分,则默认构造函数会被编译器隐式调用。DerivedDerivedBaseDerivedBase

Wrt 虚拟构造函数:C++ 中没有虚拟构造函数。

于 2013-07-08T09:08:14.150 回答