条款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。