以下のコードを実行してください:
#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 100;
}
~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 = new ClassB;
Ptr->set_values(10, 20);
cout << Ptr->area() << endl;
delete Ptr;
return 0;
}
上記のコードでは、ポインターには派生クラス オブジェクトのアドレスが含まれているため、ポインターを削除するときに基本クラスのデストラクタと共に派生クラスのデストラクタを呼び出す必要がありますが、なぜ基本クラスのデストラクタのみを呼び出すのでしょうか。基本クラスのデストラクタを仮想として作成した場合、派生クラスと基本クラスのデストラクタの両方を呼び出すのはなぜですか? 仮想関数の場合、基本クラスと派生クラスの両方が同じ関数名を持っているため、コンパイラは派生クラスで最も派生したものを解決しますが、ここではデストラクタは同じ名前を持たず、コンパイラが呼び出す必要があるものをどのように解決するか実行中に。方法を説明してください