Effective C++读书笔记(条款07:为多态基类声明virtual析构函数)

本文详细阐述了C++中虚析构函数的重要性,特别是在处理多态性基类时。非虚析构函数可能导致派生对象仅部分销毁,而引入虚析构函数可以确保正确地销毁整个对象层次。讨论了虚函数表(vtbl)的工作原理,以及析构函数的调用顺序。强调了只有当类设计用于多态目的或作为基类时,才应声明虚析构函数。此外,还提到了纯虚函数在创建抽象类中的作用。
摘要由CSDN通过智能技术生成

C++指出,当派生对象经由基类指针被删除,而该基类带有一个非虚析构函数,其结果未有定义。

实际执行时,通常发生的是派生对象成分没被销毁。基类通常会被销毁,造成一个“局部销毁”对象。解决方法很简单,给基类一个虚析构函数,此后删除的派生类对象就会如你想要的那般。

任何函数只要带有虚函数,都几乎确定应该带有一个虚析构函数 

如果类内不含虚函数,通常表示它并不意图被用做一个基类,当类不被企图当作基类,令其析构函数为虚函数通常是个馊主意。 

欲实现出虚函数,对象必须携带某些信息,主要用来在运行期决定哪一个虚函数该被调用。这份信息通常是由一个所围的vptr(virtual table pointer)指针指出。虚表指针指向一个由函数指针构成的数组,称为vtbl(virtual table)。每一个带有虚函数的class都有一个相应的虚函数表。

当对象调用某一个虚函数,实际被调用的取决于vptr所指的那个vtbl——编译器在其中寻找适当的函数指针。

只有当class内含至少一个虚函数才为它声明虚析构函数。 

纯虚函数导致抽象类——也就是不能被实体化的类。 

class A{
public:
    virtual ~A()=0;         //声明纯虚函数
}

 但必须为这个纯虚函数提供一份定义:

A::~A(){}    //纯虚函数的定义

析构函数的运作方式是,最深层派生的那个类的析构函数最先被调用,然后是其每一个基类的析构函数被调用。

编译器会在A的派生类的析构函数中创建一个对~A的调用动作,所以你必须为这个函数提供一份定义。

“给基类一个虚析构函数”,这个规则只适用于带多态性质的基类身上。这个基类的设计目的是为了用来“通过基类接口处理派生类对象”。并非所有的 基类设计都是为了多态用途,例如标准string和STL容器。

请记住:

  1. 带多态性质的基类应该声明一个虚析构函数。如果类带有任何虚函数,它就应该拥有一个虚析构函数
  2. 类设计的目的如果不是作为基类使用,或不是为了具备多态性,就不应该声明虚析构函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值