C++では、関数を実際に実装せずにヘッダファイルに関数を完全に宣言することができます。これは正常にコンパイルされ、通常これは問題を提供しません...私は、仮想デストラクタが実装されていないときに問題を引き起こす可能性がありますか?仮想デストラクタは宣言されていても実装されていないとどうなりますか?
仮想デストラクタが実装されておらず、その場合、派生クラスのインスタンスを基本クラスのポインタで削除すると、引き続き派生クラスのデストラクタが呼び出されますか?
など。
class Base{
public:
virtual ~Base() {}
};
class Derived: public Base {
public:
~Derived(); // HAS NO IMPLEMENTATION
};
Base *b = new Derived();
delete b;
注:上記の例では正しく表示されていません。より多くの洞察を得ようとしている状況を説明するためにここで提供されていますが、リンク処理中に実際にはundefined reference to Derived
というエラーが発生します。
_In C++では、関数を実際に実装せずにヘッダファイルに完全に宣言することができます。これはうまくコンパイルされ、通常、これは何の問題もありません。そうしないと、リンカエラーが発生します。それはあなたの例のようです。 –
このコメントは、私がコードに行った更新をたどっただけで、実装されるBaseのデストラクタを変更し、Derivedのデストラクタが実装されていないことに注意してください。 – Gio
実際に**あなたのコードを試しましたか?例えば、 'Derived ::〜Derived() ''への未定義参照のようなリンカエラーが発生します。 –