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.纯虚函数可以使得类变为抽象类,作为基类。
当没有其他纯虚函数时,将析构函数声明为纯虚函数是个不错的主意。这样的类既可以作为基类,又不用担心子类的析构函数不被调用而导致的内存泄露问题。
注意:由于抽象类被继承后,子类的析构函数会调用抽象类的析构函数,这时由于纯虚函数是没有定义的,必然会导致连接错误,解决方案是给抽象类的纯虚析构函数一个空的实现体。
本文探讨了C++中基类析构函数声明为virtual的重要性,避免子类析构函数未被调用导致内存泄露。同时介绍了纯虚函数在抽象类中的应用。
322

被折叠的 条评论
为什么被折叠?



