【问题标题】:At which point are the constructors of base classes called in a constructor [duplicate]此时在构造函数中调用基类的构造函数[重复]
【发布时间】:2013-11-26 10:57:03
【问题描述】:

我需要知道在派生类构造函数的调用中何时调用基类的构造函数。

Small example:

class Base1
{...}

class Base2
{...}

class Derived : Base1,Base2
{...}

int main (int argc, char** argv)
{
Derived Child;
}

使用命令Derived Child; 调用Derived 的构造函数,但我读到在执行Derived 类构造函数之前执行所有基本构造函数,即Base1 和Base2 的构造函数。

所以我想知道如果Derived 类的构造函数看起来像这样,事件顺序会如何

Derived::Derived (Parameters)
:                      //initialization list
Base2 (Parameters)
{...}

Base2的构造函数是现在在构造函数Derived的初始化列表中调用还是之前调用。此外,所有基类构造函数都在构造函数Derived的调用开始时或类Derived构造函数的初始化列表开始时被调用。

问候 直线

【问题讨论】:

  • fyi,它是 base 类,而不是 basis

标签: c++ constructor initialization-list


【解决方案1】:

构造函数的调用顺序是第一个基类然后派生类。

在当前示例中 构造函数的调用顺序如下: 基础1 基础2 派生的

如果我们将类定义更改为

派生类:Basis2,Basis1

那么构造函数调用的顺序将是: 基础2 基础1 派生的

无论是否从初始化列表显式调用,基类构造函数总是在派生类之前调用​​。

【讨论】:

  • 那么,基构造函数的初始化是立即用于基构造函数的调用吗?编译器在调用基本构造函数之前是否首先读取初始化列表?
  • 查看这段代码drive.google.com/file/d/0B1xNtnsgZBdpZXZ3TEhpUTFoRVk/…,程序的输出清楚地表明先调用基类ctr然后处理初始化列表。
  • 最后一个问题: 1. 我把你的代码改成了file-upload.net/download-8335688/main.cpp.html 为什么我得到了x :2 的输出? 2.在初始化列表中,基类构造函数也会被多次调用吗?
  • 编译您的文件时出现错误:test.cpp:24:5:错误:为基础“Basis1”提供了多次初始化
  • 好的,现在可以了 :)。您必须将派生的构造函数更改为Derived(int y):Basis2(),Basis1(6) ...。我的错 :)。结果是 OF 类 Basis1 仅调用了初始化列表的第二个 Basis1(int x) 构造函数。因此编译器必须在启动基础构造函数之前读取初始化列表,我猜这就是一般机制:1.读取初始化列表2.初始化基础构造函数,3.初始化派生构造函数
猜你喜欢
  • 1970-01-01
  • 2016-07-19
  • 2018-07-21
  • 2018-03-31
  • 1970-01-01
  • 2020-09-22
  • 2018-07-16
  • 2010-09-25
  • 2018-05-25
相关资源
最近更新 更多