虚析构函数与纯虚函数
Posted zhp-purelove
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚析构函数与纯虚函数相关的知识,希望对你有一定的参考价值。
虚析构函数
通过基类的指针删除派生类对象时,通常情况只调用基类的析构函数
但是,删除一个派生类对象时,应该先调用派生类的析构函数,然后调用基类的析构函数(构造时自顶向下,析构时自底向上)
这种情况会产生内存泄漏,最终导致系统应可用内存不足而崩溃
解决办法
把基类的析构函数声明为virtual,此时派生类的析构函数即使不声明为virtual也为virtual函数
在调用基类的指针删除派生类对象时,会先调用派生类的析构函数,最后调用基类的析构函数
一般方法
如果一个类定义了虚函数,那么析构函数也应该定义为虚函数
或者一个类打算作为基类使用,也应该讲析构函数定义为虚函数
纯虚函数与抽象类
包含纯虚函数的类叫抽象类,抽象类只能作为基类来派生新类使用,不能创建抽象类的对象
抽象类的指针和引用可以指向由抽象类派生出来的类的对象
class A; //抽象类 A a; //错误 A *pa; //正确 pa = new A; //错误
在抽象类的成员函数内可以调用虚函数,但是在构造函数或析构函数内部不能调用纯虚函数。(在成员函数内调用虚函数是多态,在构造函数和析构函数中调用虚函数不是多态)
如果一个类从抽象类派生而来,当且仅当它实现了基类中所有的纯虚函数,它才能成为非抽象类。
class A { public: virtual void f() = 0; void g() { this->f(); //正确,this指针一定指向一个派生类 } A() { //此处不能用f() } }; class B : public A { public: void f() { cout << "B:f()" << endl; } }; int main() { B b; b.g(); return 0; }
以上是关于虚析构函数与纯虚函数的主要内容,如果未能解决你的问题,请参考以下文章