析构函数定义为虚函数

转载 2013年12月05日 11:41:57

    析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。

#include<iostream.h>
#include<stdlib.h>

class CPerson
{
public:
    virtual ~CPerson();       //基类的析构函数必须声明为虚函数,否则

                                用delete销毁对象时会出错
protected:
 char * m_lpszName;
 char * m_lpszSex;
};

class CStudent:public CPerson
{
public:
 ~CStudent();              //virtual可加也可不加
protected:
 int m_iNumjber;           //学号
};

CPerson::~CPerson()
{
 cout<<"~CPerson!"<<endl;
}


CStudent::~CStudent()
{
 cout<<"~CStudent!"<<endl;
}

void main()
{
 CPerson * poCPerson = new CStudent;        //构造一个CStudent的动态对象
 if(NULL==poCPerson)
 {
  exit(0);
 }
 delete poCPerson;
 cout<<"CStudent对象已经完成析构"<<endl;     //如果析构函数是非虚函数,

                                               那么CStudent对象就未析构完
 CStudent oCStudent;
}

 

输出:

~Student!

~CPerson!

CStudent对象已经完成析构

~Student!

~CPerson!

 

如果去掉~CPerson()前面的virtual,且将“CStudent对象已经完成析构”改为“CStudent对象未完成析构”。程序的执行结果为:

~CPerson!

CStudent对象未完成析构

~Student!

~CPerson!


参考:http://359611946.blog.163.com/blog/static/1161900200976115331797/

构造函数和析构函数能否声明为虚函数?

构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数。 不建议在构造函数和析构函数里面调用虚函数。 构造函数不能声明为虚函数的原因是: 解释一:所谓虚函数就...
  • jw903
  • jw903
  • 2014年08月19日 20:35
  • 1580

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

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

为什么基类中的析构函数要声明为虚析构函数?

题目 为什么基类中的析构函数要声明为虚析构函数? 解答 用对象指针来调用一个函数,有以下两种情况: 如果是虚函数,会调用派生类中的版本。如果是非虚函数,会调用指针所指类型的实现...
  • banbanlin
  • banbanlin
  • 2014年09月25日 20:32
  • 4027

C++中析构函数定义成虚函数的原因.doc

  • 2012年04月05日 14:19
  • 31KB
  • 下载

C++:什么情况下需要将析构函数定义为虚函数?

C++:什么情况下需要将析构函数定义为虚函数。
  • rl529014
  • rl529014
  • 2016年10月17日 15:55
  • 502

析构函数定义为虚函数原因

先看下面一段程序: #include using namespace std; class Person { public: virtual ~Person()           ...
  • wangkai_123456
  • wangkai_123456
  • 2017年07月12日 16:49
  • 100

析构函数定义为虚函数原因

C++析构函数为什么要为虚函数 注:本文内容来源于zhice163博文,感谢作者的整理。 1.为什么基类的析构函数是虚函数?   在实现多态时,当用基类操作派生类,在析构时防止只析构...
  • autumn20080101
  • autumn20080101
  • 2016年08月11日 19:37
  • 98

C/C++沉思-----多态时一定要将父类(基类)的析构函数定义为虚函数

转载出处:http://blog.csdn.net/qiurisuixiang/article/details/6926313   先来看一段代码: [cpp] view plain...
  • xiarong715
  • xiarong715
  • 2013年10月23日 11:22
  • 532

析构函数什么情况下要定义为虚函数?

原文地址:http://blog.sina.com.cn/s/blog_7c773cc50100y9hz.html 1.第一段代码 #include using namespace std; ...
  • sftxlin
  • sftxlin
  • 2013年12月23日 20:30
  • 424

多态类基类析构函数定义为虚函数原因

先看下面一段程序: #include using namespace std; class Person { public: virtual ~Person()         ...
  • shenshen211
  • shenshen211
  • 2017年06月05日 13:45
  • 145
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:析构函数定义为虚函数
举报原因:
原因补充:

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