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

转载 2015年07月16日 17:15:11

先补下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++继承中析构函数的调用顺序

在继承中的析构函数主要遵从一下四点规则: 1、首先调用派生类的析构函数(清理派生类的新增成员) 2、如果派生类中有子对象 , 则再调用派生类中子对象的析构函数 , 调用顺序是:在派生类中,先定义后...
  • zengchenacmer
  • zengchenacmer
  • 2014年03月30日 16:28
  • 1793

C++类有继承时,析构函数必须为虚函数

虚函数与多态一文中讲了虚函数的用法和要点,但少讲了一点,就是虚函数在析构中的用法,本文就是修复一bug的。C++类有继承时,析构函数必须为虚函数。如果不是虚函数,则使用时可能存在内在泄漏的问题。假设我...
  • luoweifu
  • luoweifu
  • 2016年12月21日 09:24
  • 2227

为什么析构函数要声明成virtual

(zz)为什么析构函数要声明成virtual   2011-03-08 15:43:00|  分类: reproduct|字号 订阅 为什么析构函数...
  • qiangwa0
  • qiangwa0
  • 2013年08月17日 21:06
  • 2071

C++中基类的析构函数为什么要用virtual虚析构函数

C++中基类的析构函数为什么要用virtual虚析构函数, 弄清楚为什么。
  • IIcyZhao
  • IIcyZhao
  • 2013年09月22日 18:41
  • 4623

C++ virtual 析构函数

copy自:http://zxjgoodboy.blog.sohu.com/61482463.html在此基础上稍作修改 C++中虚析构函数的作用我们知道,用C++开发的时候,用来做基类的类的析构函数...
  • aore2010
  • aore2010
  • 2010年09月13日 16:44
  • 7035

为什么需要将继承层次中类的析构函数定义成virtual的?

如标题所示,如果该类没有父类也没有任何子类,把析构函数还定义成虚的,确实没多大必要吧。对象的构建和析构完全是一个入栈和出栈的过程,也就是说肯定会从父类构造到子类,也肯定会从子类析构到父类,这些都是毋容...
  • Augusdi
  • Augusdi
  • 2014年07月16日 16:36
  • 1161

基类的纯虚析构函数一定要予以实现

纯虚函数 纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。 虚函数是C++语言的精髓。含有纯...
  • friendbkf
  • friendbkf
  • 2015年05月17日 18:59
  • 1723

C++中基类的析构函数为什么要用virtual虚析构函数

C++中基类的析构函数为什么要用virtual虚析构函数, 弄清楚为什么。
  • IIcyZhao
  • IIcyZhao
  • 2013年09月22日 18:41
  • 4623

C++析构函数使用virtual的原因

  • 2013年03月03日 18:21
  • 28KB
  • 下载

Effective C++ Item 7 为多态基类声明virtual析构函数

经验1:带多态性质的基类应该声明一个virtual 析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual 析构函数 经验2:classes的设计目的如果不是作为base ...
  • zhsenl
  • zhsenl
  • 2014年05月22日 22:59
  • 439
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:有继承的C++析构函数一定要用virtual
举报原因:
原因补充:

(最多只允许输入30个字)