C++派生类的构造函数和析构函数的调用顺序实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/89742736

一 点睛

1 构造函数调用顺序规则如下:

1.1 基类构造函数

1.2 成员对象构造函数

1.3 派生类构造函数

析构函数的调用顺序与构造函数调用顺序正好相反。

析构函数在下面3种情况下被调用

  • 对象生命周期结束被销毁时

  • delete指向对象的指针时,或delete指向对象的基类类型指针,并且其基类析构函数是虚函数时

  • 对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用

二 实战

1 代码

#include<iostream>
using namespace std;
class CBase{
public:
    CBase (){ std::cout<<"CBase::CBase()"<<std::endl; }
    ~ CBase (){ std::cout<<"CBase::~CBase()"<<std::endl; }
};

class CBase1:public CBase {
public:
    CBase1 (){ std::cout<<"CBase::Base1()"<<std::endl; }
    ~ CBase1 (){ std::cout<<"CBase::~Base1()"<<std::endl; }
};

class CDerive{
public:
    CDerive (){ std::cout<<"CDerive::CDerive()"<<std::endl; }
    ~ CDerive (){ std::cout<<"CDerive::~CDerive()"<<std::endl; }
};

class CDerive1:public CBase1{
private:
    CDerive m_derive;
public:
    CDerive1(){ std::cout<<"CDerive1::CDerive1()"<<std::endl; }
    ~CDerive1(){ std::cout<<"CDerive1::~CDerive1()"<<std::endl; }
};

int main(){
    CDerive1 derive;
    return 0;
}

2 运行

[root@localhost charpter02]# g++ 0227.cpp -o 0227
[root@localhost charpter02]# ./0227
CBase::CBase()
CBase::Base1()
CDerive::CDerive()
CDerive1::CDerive1()
CDerive1::~CDerive1()
CDerive::~CDerive()
CBase::~Base1()
CBase::~CBase()

3 说明

该实战说明了构造函数的调用顺序。

如果存在基类,那么先调用基类的构造函数,如果基类还存在基类,那么程序会继续向上查找,直到找到它最早的基类进行初始化。

如果所调用的类中定义的时候存在对象被声明,那么在基类的构造函数完成后,再调用对象的构造函数。

调用派生类的构造函数。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/89742736