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

基本クラスのデストラクタがUndefined Behaviordeleteである場合を除き、派生クラス オブジェクトを指す基本クラス ポインタを呼び出さないでください。virtual

基本クラスのデストラクタはマークする必要がありますvirtual

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

virtual基本クラスでデストラクタを作成します。それ以外の場合は、ベースのデストラクタを呼び出します。

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