C++在多继承时构造函数调用的顺序

今天看书时注意到C++在多继承时,基类的构造顺序是按照继承时给定顺序执行的,析构的顺序正好相反!而与它们初始化的顺序没有任何关系,下面随便写了一个Demo程序来验证C++在多继承时基类的构造顺序。



#include <iostream>
#include <cstdlib>

using namespace std;

class a
{
public:
a(){cout<<"a constructor!!"<<endl;}
~a(){cout<<"a deconstructor!!"<<endl;}
};

class b
{
public:
b(){cout<<"b constructor!!"<<endl;}
~b(){cout<<"b deconstructor!!"<<endl;}
};

class c
{
public:
c(){cout<<"c constructor!!"<<endl;}
~c(){cout<<"c deconstructor!!"<<endl;}
};

class d
{
public:
d(){cout<<"d constructor!!"<<endl;}
~d(){cout<<"d deconstructor!!"<<endl;}
};

class e
{
public:
e(){cout<<"e constructor!!"<<endl;}
~e(){cout<<"e deconstructor!!"<<endl;}
};

class f:public e,public b,public c,public d,public a
{
public:
f(){cout<<"f constructor!!"<<endl;}
~f(){cout<<"f deconstructor!!"<<endl;}
};


int main(int argc,char * args[])
{
f testObj;

system("pause");
return EXIT_SUCCESS;
}





类f分别继承自类e,类b,类c,类d和类a,在main函数中定义了一个testObj对象,这个对象的构造顺序是e->b->c->d->a,析构顺序正好相反。


程序运行结果如下图所示
[img]pic.JPG[/img]
### C++多继承情况下的构造函数调用顺序C++多继承机制中,当一个派生类从多个基类继承构造函数调用遵循特定的规则。这些规则确保所有基类成员都能被正确初始化。 #### 基本原则 构造过程按照以下顺序执行: 1. **虚基类的构造函数**:如果存在虚基类,则优先调用虚基类的构造函数。 2. **非虚基类的构造函数**:接着按声明顺序依次调用各个非虚基类的构造函数。 3. **派生类自身的构造函数**:最后才调用派生类本身的构造函数来完成剩余部分的对象初始化[^1]。 对于具体的例子可以考虑下面这段代码展示的情况: ```cpp #include <iostream> using namespace std; class Base1 { public: Base1() { cout << "Base1 constructor called." << endl; } }; class Base2 { public: Base2(int i) { cout << "Base2 constructor with int parameter called: " << i << endl; } }; class Derived : public Base1, public Base2 { private: int m; public: // 初始化列表用于传递参数给基类构造器并初始化成员变量 Derived(int e): Base2(7), m(e){ cout << "Derived class's own initialization part completed: consD" << endl; } }; ``` 在这个案例里,`Derived` 类同继承自 `Base1` 和带参版本的 `Base2` 。创建 `Derived` 对象实例化过程中会先触发 `Base1()` 默认无参构造函数再是 `Base2(int)` 参数化的构造函数最终才是 `Derived::Derived(int)` 完成整个对象构建[^2]。 #### 输出结果分析 假设我们定义了一个 `Derived d(8);` 实例,在控制台打印的信息将会是这样的序列: - 首先是 `Base1` 的默认构造函数消息; - 接着由于显式指定了 `Base2` 构造函数所需的整数参数因此输出对应的消息; - 最终显示来自 `Derived` 自身构造逻辑里的提示语句[^3]。 这种构造次序保障了即使是在复杂的多重继承结构下也能维持良好的封装性和数据一致性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值