什么情况下,类的析构函数应该声明为虚函数?为什么?
基类的指针指向派生类对象,并用基类的指针删除派生类对象时。
虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。
如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。
所以基本的一条是:无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包含至少一个虚函数的时候才去声明虚析构函数。
抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。
扩展资料
当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。
所以注意如果基类不是虚析构函数的话可能会有以下两点问题:
1、子类所分配的内存不能被释放
2、子类中成员变量类所分配的内存也不能被释放,因为子类析构函数没有被调用,其变量的析构函数肯定也没被调用了
构造函数不能用虚拟,因为用也没用,不管是在栈上构造对象,还是在堆上构造对象,也不管以后是否使用父类的指针或引用来指向或引用这个对象,在构造的那“一瞬间",总归要指明要构造对象的具体类型,所以,对象在构造过程中不存在运行时动态绑定的多态行为。
参考资料来源:百度百科--虚析构函数
基类指针可以指向派生类的对象(多态性),如果删除该指针delete []p;就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全。所以,将析构函数声明为虚函数是十分必要的。
2.可能有基类指针,指向的确是派生类成员的情况。(这是很正常的)
那么当析构一个指向派生类成员的基类指针时,程序就不知道怎么办了。
所以要保证运行适当的析构函数,基类中的析构函数必须为虚析构。
反正你在写一个类时,将其析构函数写为虚函数总不会错,一样重载的。
参考资料: C++Primer 4