C++中虚析构函数的作用 .

我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:    
   
有下面的两个类:

class ClxBase
{
public:
    ClxBase() {};
    virtual ~ClxBase() {};

virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };
};

class ClxDerived : public ClxBase
{
public:
    ClxDerived() {};
    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };

void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };
};

代码

ClxBase *pTest = new ClxDerived;
pTest->DoSomething();
delete pTest;

的输出结果是:

Do something in class ClxDerived!
Output
from the destructor of class ClxDerived!

这个很简单,非常好理解。
    但是,如果把类ClxBase析构函数前的virtual去掉,那输出结果就是下面的样子了:

Do something in class ClxDerived!

也就是说,类ClxDerived的析构函数根本没有被调用!一般情况下类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。我想所有的C++程序员都知道这样的危险性。当然,如果在析构函数中做了其他工作的话,那你的所有努力也都是白费力气。
    所以,文章开头的那个问题的答案就是--这样做是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
    当然,并不是要把所有类的析构函数都写成虚函数。因为当类里面有虚函数的时候,编译器会给类添加一个虚函数表,里面来存放虚函数指针,这样就会增加类的存储空间。所以,只有当一个类被用来作为基类的时候,才把析构函数写成虚函数。

时间: 2024-08-03 20:24:56

C++中虚析构函数的作用 .的相关文章

C++中虚析构函数的作用 (转载)

转自:http://blog.csdn.net/starlee/article/details/619827 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类: class ClxBase { public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout << "Do something i

虚析构函数的作用

1  class ITest 2  { 3  public: 4      virtual void Test() = 0; 5 6  }; 7 8  class CTest : public ITest 9  { 10 public: 11     CTest()  { printf("constructor.n"); }; 12     ~CTest() { printf("destructor.n"); }; 13     virtual void Test(

C++中基类虚析构函数的作用及其原理分析

虚析构函数的理论前提是 执行完子类的析构函数,那么父类的虚构函数必然会被执行. 那么当用delete释放一个父类指针所实例化的子类对象时,如果没有定义虚析构函数,那么将只会调用父类的析构函数,而不会调用子类的虚构函数,导致内存的泄漏. 故: 继承时,要养成的一个好习惯就是,基类析构函数中,加上virtual. 知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual

关于虚析构函数的作用和使用

作用:作为基类使用的类应该具有虚析构函数,以保证在删除基类指针(动态分配的对象)时.依据指针实际指向的对象进行适当的析构. 请看以下这段代码; #include <iostream> class A{ public: A(){ std::cout << "A constructor execute" << std::endl; } ~A(){ std::cout << "A destructor execute" &l

C++中虚函数的作用是什么?它应该怎么用呢?

虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码 class A{

c++中虚析构函数

当指向基类的指针指向新建立的派生类对象而且基类和派生类都调用new向堆申请空间时,必须将基类的析构函数声明为虚函数,从而派生类的析构函数也为虚函数,这样才能在程序结束时自动调用它,从而将派生类对象申请的空间归还给堆. 附上一段代码诠释上述概念: #include <iostream> #include <string> using namespace std; class base{ char *p; public: base(int sz,char *bptr){ p=new c

C++虚函数与虚析构函数

在类中,有两个与众不同的成员函数,那就是构造函数和析构函数.当构造函数与析构函数遭遇继承和多态,它们的运行状况又会出现什么变化呢? 多态性是在父类或各子类中执行最合适成员函数.一般来说,只会选择父类或子类中的某一个成员函数来执行.这可给析构函数带来了麻烦!如果有的资源是父类的构造函数申请的,有的资源是子类的构造函数申请的,而虚函数只允许程序执行父类或子类中的某一个析构函数,岂不是注定有一部分资源将无法被释放?为了解决这个问题,虚析构函数变得与众不同. 下面我们就来给析构函数的前面加上保留字vir

Virtual以及虚析构函数

Typedef int (*healthcalcfunc)(const gamecharacter&) 当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数.因此,在子类从新声明该虚函数时,可以加,也可以不加,但习惯上每一层声明函数时都加virtual,使程序更加清晰. 友元函数 构造函数 static静态函数 不能用virtual关键字修饰: 普通成员函数 和析构函数 可以用virtual关键字修饰: virtual函数的效果 即用基类指针指向继承类对象,接着便可以用该指针使用

虚析构函数

简单来说析构函数就是回收站.若系统不及时去回收这些垃圾(通常是无用的内存资源),那么时间越久肯定会有越来越多的垃圾.在开相同的程序,有时候手机和电脑重启了一下,速度会明显变快很多.因为RAM中的资源掉电后就释放了. 在C++中,析构函数就是释放无用资源的.在派生类中,假设用基类指针指向了一个派生类的临时变量.那么会发生什么情况.实际上这个时候只会释放基类的无用资源而没有释放这个临时的派生类的资源. #include<iostream> usingnamespacestd; classPoint