继承类中的构造函数?

Posted

技术标签:

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

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

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

1) 构造基类成员

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

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

【问题讨论】:

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

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

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

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

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)

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

【讨论】:

以上是关于继承类中的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

继承中子类构造函数相关问题

模板类中的构造函数继承 (C++11)

子父类中的构造函数

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程

为什么抽象类中的构造函数可以被继承并被调用?

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-细节