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

条款7:为多态基类声明virtual析构函数。

1、在创建有层次的类时,往往要把基类的析构函数声明为虚函数。
这是因为在使用这些类时,往往是通过基类指针或者引用使用的(类的实例在堆上),如果是析构对象时,通过delete +指针,这时如果析构函数不是虚函数,将不会调用当前指针指向对象的析构函数。这是多态的原理。
实例如下:
https://blog.csdn.net/Struggling_Jeff/article/details/101381661
2、此外,要实现多态的函数,在基类也要声明为虚函数。 当一个类不用做基类时,如果把其析构函数声明为虚函数是个馊主意。因为虚析构是通过虚函数表调用的,在调用虚函数时多一步指针操作;除此之外,其对象占用的内存空间也会多一个虚函指针。
我们还容易犯这样的错误: 从标准库中的某个类中继承一个,用作自己的使用。但是,标准库中的很多类是不含virtual函数的!比如,string类,STL的容器类等等。

class MyString:public string  
{ 
public:  
    MyString(string str,int i):s(str),length(i){}  
~MyString(){cout<<"MyString 析构函数"<<endl;}  
private:  
    string m_s;  
    int m_length;  
};  

调用会产生未知的风险!

string* pStr = new MyString("aaa");
delete pStr;  

可能出现内存泄漏严重问题。

3、总结。
如果这这个基类在派生过程中要实现多态,那么就需要把它的析构函数设为virtual;如果这个类并不是用作基类或者并不是实现多态,那么就不要设为virtual。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值