派生类对象初始化时构造顺序是什么?

本文详细探讨了C++中派生类对象初始化的顺序,指出在初始化时先按基类顺序,再按public列表顺序进行。同时,析构函数的顺序与构造函数相反,遵循先进后出的原则。示例代码展示了这一过程,并解释了这一顺序的原因。
摘要由CSDN通过智能技术生成

派生类对象初始化时构造顺序是什么?

#include <iostream>
using namespace std;

class Base {
public:
    Base(int i) {
        cout << i;
        cout << "Base"<< endl;
    }
    ~Base() {
        cout << "~Base" << endl;
    }
};

class Base1 : virtual public Base {
public:
    Base1(int i, int j=0):Base(j) {
        cout << i;
        cout << "Base1"<< endl;
    }
    ~Base1() {
        cout << "~Base1" << endl;
    }
};

class Base2 : virtual public Base {
public:
    Base2(int i, int j=0):Base(j) {
        cout << i;
        cout << "Base2"<< endl;
    }
    ~Base2() {
        cout << "~Base2" << endl;
    }
};

class MM : public Base2, public Base1 {
public:
    MM(int a, int b, int c, int d) : mem1(a), mem2(b), Base1(c), Base2(d), Base(a) {
        cout << b;
        cout << "MM"<< endl;
    }
    ~MM() {
        cout << "~MM" << endl;
    }

private:
    Base2 mem2;
    Base1 mem1;
};

int main() {

    MM obj(1,2,3,4);

    return 0;
}

结果输出:

1Base
4Base2
3Base1
0Base
2Base2
0Base
1Base1
2MM
~MM
~Base1
~Base
~Base2
~Base
~Base1
~Base2
~Base

总结:先初始化基类,再按照public列表的顺序来初始化,然后初始化使用基本构建的对象,最后初始化派生类中的对象
(即按照c++代码中出现的顺序来执行初始化)
对于析构函数来说,它的顺序正好和构造函数相反,估计是因为这些对象都是存储在stack上,遵循“先进后出”的原则,所以应该是先构造的后析构(和函数嵌套的道理应该类似)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值