C++相談室 part30
■ このスレッドは過去ログ倉庫に格納されています
0671デフォルトの名無しさん
NGNGなぜ適切にデストラクタが呼び出されるのか理解に詰まってるので教えてください。
たとえば以下のような基底クラスと派生クラスがあったコードの場合
class CParent {
int m_nSize;
public:
CParent(int nSize =0) : m_nSize(nSize) {}
~CParent(){}
};
class CChild : public CParent {
int* m_lpnData;
public:
CChild(int nSize =0) : CParent(nSize), m_lpnData(new int [nSize]){}
~CChild(){ delete [] m_lpnData; }
};
int main() {
CParent* p =new CChild(10);
delete p;
return 0;
}
このようにするとpがCParentのポインタのためCChildのデストラクタが呼ばれないのはわかります。
しかし、ここでCParentのデストラクタにvirtualを付加すると、なぜCChildのデストラクタから適切に
呼ばれるのでしょうか。
virutalは派生クラスで関数をオーバーライドするときに使うものだと理解しています。
関数がオーバーライドされている場合は、ポインタが基底クラスのものでも実行時型が
派生クラスのものであれば、派生クラスのオーバーライドした関数が呼ばれるのはわかります。
しかし、関数をオーバーライドしていない場合は基底クラスの関数が呼ばれると思います。
このコードの場合、派生クラスでは基底クラスのデストラクタをオーバーライドしているわけではないですし、
デストラクタの名前ももちろん違うのに、なぜCChildのデストラクタが呼ばれるのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています