继承中的析构函数

时间:2013-03-07 11:11:26

标签: c++ inheritance destructor

我在浏览下面的代码时有疑问。即,即使派生类的对象超出下面代码中的范围,为什么不调用派生类的析构函数:

#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;

class ClassA
{
    protected:
        int width, height;
    public:
      void set_values(int x, int y)
      {
        width = x;
        height = y;
      }
      virtual int area()
      {
        return 0;
      }
      ~ClassA()
      {
         cout << "base class destructor called" << endl;
      }
 };

class ClassB : public ClassA
{
      public :
   int area()
   {
     return (width * height);
   }
   ~ClassB()
       {
      cout << "derived class destructor called" << endl;
   }
 };


 int main()
 {
   ClassA *Ptr = NULL;
   ClassB Obj;
   Ptr = &Obj;
   Ptr->set_values(10, 20);
   cout << Ptr->area() << endl;
   delete Ptr;
     return 0;
 }

2 个答案:

答案 0 :(得分:4)

除非基类析构函数为delete,否则不应在指向派生类对象的基类指针上调用virtual,否则得到的是未定义行为

基类中的析构函数需要标记为virtual

virtual ~ClassA(){}

答案 1 :(得分:1)

在基类中创建析构函数virtual。否则,它会调用base的析构函数。

class ClassA
{
// ...
      virtual ~ClassA()
      {
         cout << "base class destructor called" << endl;
      }
};