gpt4 book ai didi

c++ - 继承中调用构造函数的顺序

转载 作者:行者123 更新时间:2023-11-30 02:00:43 24 4
gpt4 key购买 nike

我是 C++ 编程语言的新手,我对继承中调用构造函数的顺序感到困惑。我的问题是,即使派生类没有继承构造函数和析构函数,为什么当我创建派生类对象时基类构造函数会调用。

最佳答案

构造函数的目的是定义数据成员应该如何初始化。由于派生类从基类继承数据成员,因此派生类的任何构造函数不仅必须定义如何初始化派生类特有的数据成员,还必须定义来自基类的数据成员。

执行此操作(并且是 C++ 标准要求的)的自然方法是调用基类构造函数。如果您没有在派生类构造函数的初始化列表中包含特定构造函数调用,则基类的默认构造函数将用于初始化基类成员。

struct base
{
int _i; // a data member
base():_i(0) {} // default constructor
base(int i):_i(i) {} // special constructor
};

struct derived : base
{
int _j; // a data member specific to the derived class
derived(int i, int j):_j(j) {} // user-defined constructor for the derived class
};

上面的例子说明了派生类的构造函数如何初始化它的成员_j,但是来自基类的成员_i必须使用一个基类来初始化-类构造函数。

按照上面的写法,编译器会自动调用默认构造函数base::base(),即_i会被初始化为0。

但是您可以通过包含对特定构造函数的调用来更改该行为:

struct derived : base
{
int _j;
derived(int i, int j):base(i),_j(j) {} // user-defined constructor for the derived class
};

构造函数调用的顺序是:首先是基类的构造函数调用,然后是派生类特定成员的初始化程序。这是很自然的,因为从某种意义上说,派生类是基类的扩展,将派生类对象的基类部分视为是有道理的先有

关于c++ - 继承中调用构造函数的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com