C++基础知识 - 子类(派生类)的析构函数

本文探讨了C++中子类(派生类)析构函数的调用顺序,强调其与构造函数顺序相反。同时指出静态成员的析构函数在程序结束前不会被调用。

子类(派生类)的析构函数

子类的析构函数的调用顺序,和子类的构造函数的调用顺序相反!!!
记住,相反即可。

#include <iostream>
#include <Windows.h>

using namespace std;

class M {
   
   
public: M() 
C++中,子类重写析构函数有特定的方法和需要注意的事项。 ### 方法 当基类的析构函数被声明为虚函数时,子类可以重写析构函数。在子类中定义析构函数,不需要额外的关键字声明,只要基类析构函数是虚函数,子类析构函数就会自动重写基类的析构函数。例如: ```cpp class Base { public: virtual ~Base() { std::cout << "Base destructor" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor" << std::endl; } }; ``` 在这个例子中,`Base`类的析构函数被声明为虚函数,`Derived`类继承自`Base`类并重写了析构函数。 ### 注意事项 - **基类析构函数必须为虚函数**:如果基类的析构函数不是虚函数,当通过基类的指针或引用删除派生类对象时,只会调用基类的析构函数,而不会调用派生类析构函数,这可能会导致资源泄漏。例如: ```cpp class Base_3 { public: ~Base_3() { std::cout << "Base_3 destructor" << std::endl; } }; class BasePlus_5 : public Base_3 { public: ~BasePlus_5() { std::cout << "BasePlus_5 destructor" << std::endl; } }; int main() { Base_3 * pBase_3 = new BasePlus_5; delete pBase_3; // 只会调用Base_3的析构函数 return 0; } ``` 若将基类析构函数声明为虚函数,如`class Base_4`所示,就会先调用派生类析构函数,再调用基类析构函数,避免资源泄漏 [^2]。 - **纯虚析构函数需提供定义**:如果将基类的析构函数定义为纯虚函数,虽然基类成为抽象基类不能直接实例化,但必须为纯虚析构函数提供函数体,否则在派生类析构时调用基类析构函数会导致链接错误 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值