继承类中的构造函数?
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)
更复杂,但基本上和以前一样。
【讨论】:
以上是关于继承类中的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章