C++派生类的构造函数和析构函数的调用顺序实战 向右看齐 2021-09-19 04:50 341阅读 0赞 **一 点睛** 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 说明 该实战说明了构造函数的调用顺序。 如果存在基类,那么先调用基类的构造函数,如果基类还存在基类,那么程序会继续向上查找,直到找到它最早的基类进行初始化。 如果所调用的类中定义的时候存在对象被声明,那么在基类的构造函数完成后,再调用对象的构造函数。 调用派生类的构造函数。
还没有评论,来说两句吧...