virtual析构函数的作用

析构函数是为了在对象不被使用之后释放它的资源,虚函数是为了实现多态。那么把析构函数声明为vitual有什么作用呢?,下面通过例子来说明一下vitual的用途。

using namespace std;

class Base
{
public:
  Base() {};     //Base的构造函数
  ~Base()        //Base的析构函数
  {
    cout << "the destructor of class Base!" << endl;
  };
  virtual void DoSomething() 
  {
    cout << "Do something in class Base!" << endl;
  };
};
    
class Derived : public Base
{
public:
  Derived() {};     //Derived的构造函数
  ~Derived()      //Derived的析构函数
  {
    cout << "the destructor of class Derived!" << endl;
  };
  void DoSomething()
  {
    cout << "Do something in class Derived!" << endl;
  };
};
    
int main()
{
  Derived *pTest1 = new Derived();   //Derived类的指针
  pTest1->DoSomething();
  delete pTest1;
    
  cout << endl;
    
  Base *pTest2 = new Derived();      //Base类的指针
  pTest2->DoSomething();
  delete pTest2;
    
  return 0;
}

先看程序输出结果:
1       Do something in class Derived!
2       the destructor of class Derived!
3       the destructor of class Base!
4      
5       Do something in class Derived!
6       the destructor of class Base!

从运行结果来看,pTest1运行比较正常,也好理解,pTest2运行了子类的Do something和父类的析构函数,并没有运行子类的析构函数,这样会造成内存泄漏。

pTest2运行了子类的Do something量因为父类的Do something加了virtual。

pTest2运行了父类的析构函数是因为父类的析构函数并没有加virtual,所以它并不会运行子类的析构函数。

如果Base的析构函数加上virtual,那么pTest1和pTest2运行过程一样。

总结:如果一个类有可能会被继承,那么它的析构函数最好加上virtual,不然出现内存泄漏问题找都找不到。

时间: 2024-08-07 12:16:23

virtual析构函数的作用的相关文章

【C++基础 08】virtual析构函数的作用

在面向对象语言中,接口的多种不同的实现方式即为多态.c++可以使用virtual来实现多态. 如果不使用virtual的话,C++对成员函数使用静态联编,而使用virtual,并且在调用函数时是通过指针或引用调用,C++则对成员函数进行动态编联(也就是迟后绑定,运行的时候才确定调用哪个对象). 关于virtual的用法比较简单,不再复述,我们这次来看看virtual析构函数的作用. 1.示例 我们先来看一段代码: class A { public: ~A() { cout<<"~A(

Effective C++ .07 virtual析构函数的提供

主要讲了, 1. virtual析构函数的作用与调用顺序 2. 使用时机,并不是使用了继承就要把基类的析构函数变为虚函数(virtual),只有当用于多态目的时才进行一个virtual析构函数的定义. 3. 不要继承那些没有将析构函数定义为virtual的类来实现多态行为 对于1: 有些类继承可能只是一个组合的作用,这样加入virtual析构函数就会使得类实例的空间占用增加(一个vptr) 对于2: 如果继承确实是为了实现多态效果,那么最好定义一个virtual析构函数(自己认为,当不涉及到资源

虚析构函数的作用

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(

Effective C++学习笔记 条款07:为多态基类声明virtual析构函数

一.C++明确指出:当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未定义——实际执行时通常发生的是对象的derived成分没有被销毁!(注:使用基类引用派生类的方式使用多态,由于引用只是对原对象的一个引用或者叫做别名,其并没有分配内存,对其引用对象内存的销毁,将由原对象自己负责,所以使用引用的时候,如果析构函数不为virtual,那么也不会发生derived成员没有销毁的情况) 例如: class b

条款7:为多太基类声明virtual析构函数

NOTE: 1.polymorphic(多态性质的)base classes 应该声明一个virtual 析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. 2.Classes 的设计目的如何不是作为bases classes 使用,或不是为了具备多态性(polymorphically),就不该声明为virtual 析构函数.

C#中类的继承 override virtual new的作用以及代码分析

继承中override virtual new的作用 virtual     父类中需要注明允许重写的方法: override   子类中必须显示声明该方法是重写的父类中的方法: new         子类中忽略父类的已存在的方法,“重写该方法“: C#中不支持隐式重写子类的方法 即如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法(new),而不能覆盖(override): 代码分析 这是一个base类A有很多子类: 1 class A 2 { 3 publ

Effective C++_笔记_条款07_为多态基类声明virtual析构函数

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个规则只适用于polymorphic(带多态性质的)base class身上.这种base class的设计目的是为了用来“通过base class接口处理derived class对象”.假如我们在程序中设计factory(工厂)函数,让它返回base class指针,指向新生成的derived class对象,假设base class有个non-virtu

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

Item 07-为多态基类声明virtual析构函数 Declare destructors virtual in polymorphic base class why?  http://blog.csdn.net/wxqian25/article/details/7361069 Ex: 记录时间有多种做法,一个基类和一些派生类 class TimeKeeper{                        //    base class 基类 public: TimeKeeper(); ~

07——为多态基类声明为virtual析构函数

当基类确定被继承的时候,析构函数声明为virtual是必须的 当返回的派生类的指针或引用的时候,调用析构函数容易发生内存泄漏 当基类作为抽象类使用,声明pure virtual析构函数 析构函数的顺序————派生类的析构函数先被调用(先析构基类成员) 构造函数的顺序————派生类的构造函数先被调用(先构造基类成员) 07--为多态基类声明为virtual析构函数