class a
{
public : ~a() { cout << "a"; };
};
class b :virtual public a
{
public : ~b() { cout << "b"; };
};
私がそのようなものを作ろうとしたとき、このコードで:
a* p = new b;
delete p;
私にエラー(中止)を与えますが、仮想継承を削除すると機能しました。仮想デストラクタなしでそのようなものを作成するのは真実ではないことを私は知っていますが、なぜこのエラーは仮想継承を使用した場合にのみ表示されるのですか?
継承が仮想であるかどうかに関係なく、削除はどちらの場合も未定義の動作です。
スーパークラスへのポインタを使用して削除を実行できるようにするには、スーパークラスに仮想デストラクタが必要です。
コードの1つのバリエーションがプラットフォームで機能するからといって、どちらのバリエーションも有効であるとは限りません。そうではない。デストラクタを仮想デストラクタに変更すると、継承が仮想であるかどうかに関係なく、これが機能するはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加