0

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

#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;
 }
4

2 回答 2

4

你不应该调用delete指向派生类对象的基类指针,除非基类析构函数是virtual你得到的是Undefined Behavior

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

virtual ~ClassA(){}
于 2013-03-07T11:13:05.037 回答
1

virtual在基类中制作你的析构函数。否则,它调用 base 的析构函数。

class ClassA
{
// ...
      virtual ~ClassA()
      {
         cout << "base class destructor called" << endl;
      }
};
于 2013-03-07T11:12:26.663 回答