【问题标题】:Copy constructor - is the base one called before the derived one?复制构造函数 - 在派生构造函数之前调用基本构造函数吗?
【发布时间】:2013-07-08 09:00:17
【问题描述】:

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

这段代码:

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

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

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

【问题讨论】:

  • What if they're virtual? 构造函数不能是虚拟的。
  • @Fiktik 他可能是指虚拟继承:如果基类是虚拟的会怎样。

标签: c++


【解决方案1】:

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

如果定义了拷贝构造函数,你需要显式的 称其为基地;否则,默认构造函数 base 将被调用。 (在极少数情况下,这就是 通缉。但通常不会。)

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

【讨论】:

    【解决方案2】:

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

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

    构造函数不是在之后调用另一个。 Base 构造函数在Derived 构造函数的内部调用,在初始化列表中,在进入Derived 的构造函数主体之前。这适用于所有构造函数,不仅适用于 copy-ctors。如果您没有在Derived 构造函数的初始化列表中提及Base 部分,则编译器会隐式调用Bases 默认构造函数。

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

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 2018-07-21
      • 2016-07-19
      • 2010-10-18
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2018-07-16
      相关资源
      最近更新 更多