ShiZhixin的专栏

Information Security, Big Data, DM&ML

有继承的C++析构函数一定要用virtual

先补下virtual是啥

虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。 

 

先贴个代码,再解释

复制代码
#include <iostream>

using namespace std;

class Base
{
public:
    Base(){cout<<"Base Construct"<<endl;};
    ~Base(){cout<<"Base destroy"<<endl;}
       
};

class A : public Base
{
public:
    A(){cout<<"A Construct"<<endl;}
    ~A(){cout<<"A destroy"<<endl;}
};
class Base1
{
public:
    Base1(){cout<<"Base1 Construct"<<endl;};
    virtual  ~Base1(){cout<<"Base1 destroy"<<endl;}
       
};

class A1 : public Base1
{
public:
    A1(){cout<<"A1 Construct"<<endl;}
    ~A1(){cout<<"A1 destroy"<<endl;}
};

int main()
{
    Base* p = new A;
    delete p;
    cout<<"======================"<<endl;
    Base1* p1 = new A1;
    delete p1;
    return 0;
}
/*
  Base Construct
  A Construct
  Base destroy
  ======================
  Base1 Construct
  A1 Construct
  A1 destroy
  Base1 destroy
*/
复制代码

在代码尾部的注释就是输出。

Base的析构函数没有virtual

Base1的析构函数有virtual

 

Base* p = new A

delete p

这个过程只调用了Base的析构函数,没有调用A的析构函数。

这样在实际应用中会有不确定的后果,可能会memory leak

应该在A的析构函数中我们可能会销毁一些其他的资源,而这里并未调用。

所以要给Base的析构函数以virtual属性。

阅读更多
个人分类: 转载 C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭