虚析构函数的作用

来源:互联网 发布:网络群众路线 编辑:程序博客网 时间:2024/05/18 02:16

析构函数的作用就在于我们调用完一个类对象时,为了避免内存泄漏,我们必须删除这个类对象,这时析构函数就派上用场了。

但是,当我我们定义一个基类指针指向派生类后,再删除这个指针时我们会发现,程序只是调用了基类的析构函数,却没有调用派生类的析构函数。为了解决这个问题,虚析构函数闪亮登场!当!当!当!

虚析构函数只是在析构函数前面加上了一个virtual而已,下面,我们通过程序来理解下,过程吧。

class Base {                //基类public:Base() {} ~Base() {cout << "Successfully delete A!" << endl;}virtual void go() {cout << "父类" << endl;}};class Derive :public Base {      //派生类public: Derive() {}~Derive() {cout << "Successfully delete B!" << endl;}void go() {cout << "子类" << endl;}};void main() {    Base *p2 = new Derive;    p2->go();    delete p2;    system("pause");}

上面的基类的析构函数并没有被virtual声明:运行结果如下

我们可以看到,上述程序只调用了基类的析构函数,这样派生类没有被删除,容易导致内存泄漏。我们修改下程序

class Base {                //基类public:Base() {} virtual ~Base() {cout << "Successfully delete A!" << endl;}virtual void go() {cout << "父类" << endl;}};class Derive :public Base {      //派生类public: Derive() {}~Derive() {cout << "Successfully delete B!" << endl;}void go() {cout << "子类" << endl;}};void main() {    Base *p2 = new Derive;    p2->go();    delete p2;    system("pause");}
再来看结果:


嗯,成功调用派生类的析构函数啦!

0 0