【问题标题】:constructor in inherited class?继承类中的构造函数?
【发布时间】:2020-06-09 23:15:05
【问题描述】:

我正在学习 C++ 中的类继承并阅读以下内容:

在构造派生类时,会构造它的基类部分 第一的。操作顺序为:

1) 构造基类成员

2) 调用基类构造函数代码

有人能解释一下 1 和 2 的区别吗? 如果不调用基类构造函数,如何构造基类成员?这不是构造函数的工作吗?

【问题讨论】:

  • 没有。阅读成员初始化列表:en.cppreference.com/w/cpp/language/constructor
  • 成员(和基类)总是在进入构造器主体之前被构造。在构造函数主体中设置成员的任何操作都是赋值,而不是初始化。
  • 您在 20 分钟前提出了完全相同的问题。
  • 在构造基类时,它的成员首先被初始化(对于作为另一个类的实例的成员,包括执行它们的构造函数)。基类的主体然后执行(例如)修改(例如重新分配)成员在初始化后的值。这会递归地发生——构造派生类的过程首先执行基类的构造函数,然后初始化派生类的成员,然后是派生类构造函数的主体。如果任何碱基是虚拟的,则存在细微差别,但适用相同的一般逻辑。
  • 阅读第一条评论 jtbandes 中的链接,了解成员初始化器列表使用示例。它的工作不是防止重新分配。它的工作是初始化。

标签: c++ class inheritance


【解决方案1】:

在尝试理解派生类构造之前,您应该了解类构造。一个类是如何构建的?构造类时,首先构造其数据成员。构造函数内部的执行顺序是:

  1. 类成员已构建。
  2. 构造函数体被调用。

如何在不调用构造函数的情况下构造类成员?它们不是,因为这是构造函数工作的一部分。构造函数被调用,此时 构造函数 构造类成员,然后构造函数执行其主体(在您阅读的任何内容中称为其“代码”)。

MyClass::MyClass()   // <-- entry point for the constructor
                     // <-- construct members
{ /* do stuff */ }   // <-- the body/code

您可以通过initialization list 控制成员构造,也可以使用成员的默认构造。


准备好继承了吗?唯一的补充是基类被添加到了初始化列表的开头。

Derived::Derived()   // <-- entry point for the derived class constructor
                     // <-- construct base class (see below)
                     // <-- construct members
{ /* do stuff */ }   // <-- the body/code
Base::Base()         // <-- entry point for the base class constructor
                     // <-- construct members (a.k.a. step 1)
{ /* do stuff */ }   // <-- the body/code (a.k.a. step 2)

更复杂,但基本上和以前一样。

【讨论】:

    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2013-02-12
    • 2015-11-08
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多