私は 3 つの型を使用するこのテスト コードを作成しました:struct One
仮想メンバーを持たない通常の型struct Two : One
、純粋な仮想関数と仮想デストラクタを持ち、のインターフェイスをstruct Three : Two
実装します。Two
#include <iostream>
struct One
{
~One() {
std::cout << "~One()\n";
}
};
struct Two : One
{
virtual ~Two() {
std::cout << "~Two()\n";
}
virtual void test() = 0;
};
struct Three : Two
{
virtual ~Three() {
std::cout << "~Three()\n";
}
virtual void test() {
std::cout << "Three::test()\n";
}
};
int main()
{
Two* two = new Three;
two->test();
One* one = two;
delete one;
}
当然のことながら、出力は次のようになりました。
Three::test()
~One()
すべてのデストラクタを仮想化する以外に、これを修正する方法はありますか? それとも、プログラマーはこのような状況に陥らないように注意する必要がありますか? これをコンパイルするときに警告がないのは奇妙だと思います。