什么时候需要虚析构函数

类别:编程语言 点击:0 评论:0 推荐:
答案:当你的类准备给别人继承时要提供虚析构函数
  考虑下面例子:
  class A
  {
  public:
   A(){cout << "In A constructor" << endl;}
   ~A(){cout << "In A destructor" << endl;}
  };
  
  class B : public A
  {
  public:
   B()
   {
   cout << "In B constructor" << endl;
   m_p = new char[10];
   }
   ~B()
   {
   cout << "In B destructor" << endl;
   if (m_p) delete [] m_p;
   }
  private:
   char *m_p;
  };
  
  int main(int argc, char* argv[])
  {
   //printf("Hello World!\n");
   A *p = new B;
   delete p;
  
   return 0;
  }
  输出结果:
  In A constructor
  In B constructor
  In A destructor
  
  并没有调用B的析构函数,new出来的内存没有及时回收造成内存泄漏。
  要解决这个问题,只要将A的析构函数定义为虚函数:~A(){cout << "In A destructor" << endl;}。为什么定义为虚函数就能解决呢?我是这样理解的:
  象其它虚构函数一样,~B()重定义(overridden)了~A(),这样指向派生类的指针就能根据运行时的状态调用B的析构函数了。这里又有一个问题:为什么还会调用A的析构函数呢?我只能理解为析构函数是一个特殊的函数,由系统维护其机制。就像B.~A()是错误而B.~B()(虽然逻辑上不对,但语法上是正确的,编译运行完全没问题)是正确的一样。
  
  Any idea for this?

本文地址:http://com.8s8s.com/it/it23646.htm