[解決済み] C++で抽象クラスに対して仮想デストラクタを宣言する理由は何ですか?
2022-04-23 05:04:39
質問
C++でベースクラスに対して仮想デストラクタを宣言するのは良い習慣だと思いますが、常に
virtual
デストラクタは、インターフェイスとして機能する抽象クラスであっても有効ですか?その理由と例を教えてください。
解決方法は?
インターフェイスの場合はさらに重要です。あなたのクラスのユーザは、おそらく具象実装へのポインタではなく、インターフェイスへのポインタを保持することになるでしょう。それを削除しようとしたとき、もしデストラクタが仮想でなければ、派生クラスのデストラクタではなく、インターフェースのデストラクタ(または、指定しなかった場合は、コンパイラが提供するデフォルト)を呼び出すことになるでしょう。即座にメモリーリークが発生します。
例えば
class Interface
{
virtual void doSomething() = 0;
};
class Derived : public Interface
{
Derived();
~Derived()
{
// Do some important cleanup...
}
};
void myFunc(void)
{
Interface* p = new Derived();
// The behaviour of the next line is undefined. It probably
// calls Interface::~Interface, not Derived::~Derived
delete p;
}
関連
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み] なぜC++では純粋仮想デストラクタが必要なのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません