Effective C++ ——为多态基类声明虚析构函数

本文探讨了C++中基类析构函数声明为virtual的重要性,避免子类析构函数未被调用导致内存泄露。同时介绍了纯虚函数在抽象类中的应用。

1.多态基类需要声明一个virtual 析构函数
2.不作为基类的类则不需要声明virtual 析构函数,否则是个馊主意,因为虚函数会增加类的体积.有一个心得是当一个类至少含有一个virtual 函数时,需将析构函数声明为virtual。
3.当一个类不含有virtual析构函数时,被用来当基类时会导致子类析构函数没有被调用,内存泄露风险。如:string 类,stl 容器类等都是不含有virtual析构函数的类。
下面的例子有两个功能:一、说明vptr指针的存在 二、基类析构函数有无virtual关键字区别很大,关系到子类的析构函数能不能被调用

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

class Animal
{
public:
    Animal()
    {
        cout << "Animal---构造函数" << endl;
    }
    virtual ~Animal()
    {
        cout << "Animal---析构函数" << endl;
    }

};
class Tiger :public Animal
{
public:
    Tiger()
    {
        cout << "Tiger---构造函数" << endl;
    }
    ~Tiger()
    {
        cout << "Tiger---析构函数" << endl;
    }
};
int main()
{
    cout << sizeof(Animal) << endl;//4,没有virtual 则为1    
    Animal *tiger = new Tiger();
    delete tiger;//父类Animal 析构函数 没有virtual 关键字修饰,则delete tiger时不会调用子类的析构函数,会导致子类的内存没有释放,内存泄露
    cin.get();
    return 0;
}

4.纯虚函数可以使得类变为抽象类,作为基类。
当没有其他纯虚函数时,将析构函数声明为纯虚函数是个不错的主意。这样的类既可以作为基类,又不用担心子类的析构函数不被调用而导致的内存泄露问题。
注意:由于抽象类被继承后,子类的析构函数会调用抽象类的析构函数,这时由于纯虚函数是没有定义的,必然会导致连接错误,解决方案是给抽象类的纯虚析构函数一个空的实现体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值