首页 > 代码库 > 基类析构函数为虚函数

基类析构函数为虚函数

代码:析构函数为非虚函数

技术分享
#include <iostream>using namespace std;class A {    public:        A()        {            cout << "A" << endl;        }        ~A()        {            cout << "~A" << endl;        }};class B : public A{    public:        B()        {            cout << "B" << endl;        }        ~B()        {            cout << "~B" << endl;        }};int main(int argc, char** argv){    A *pa = new B();    delete pa;    B *pb = new B();    delete pb;}
View Code

输出:

A
B
~A
A
B
~B
~A

指向子类对象的基类指针,析构过程未调用子类的析构函数,若子类申请内存空间,则将无法被释放,导致内存泄漏。

代码:析构函数为虚函数

技术分享
#include <iostream>using namespace std;class A {    public:        A()        {            cout << "A" << endl;        }        virtual ~A()        {            cout << "~A" << endl;        }};class B : public A{    public:        B()        {            cout << "B" << endl;        }        virtual ~B()        {            cout << "~B" << endl;        }};int main(int argc, char** argv){    A *pa = new B();    delete pa;    B *pb = new B();    delete pb;}
View Code

输出:

A
B
~B
~A
A
B
~B
~A

指向子类对象的基类指针,析构过程先调用子类析构函数,再调用基类析构函数。

若析构函数为非虚函数时,delete p 会直接调用相应指针类型的析构函数 即父类析构函数。若析构函数为虚函数时,则会调用实际对象的析构函数,即子类析构函数,子类继承自父类,子类析构函数调用完,会接着调用父类析构函数。

基类析构函数为虚函数