1. ホーム
  2. c++

[解決済み] C++"仮想関数があるが仮想デストラクタがない"

2022-02-15 04:31:36

質問

ベースクラス Media といくつかの派生クラス、すなわち DVD , Book などなど... ベースクラスは、次のように書きます。

class Media{
    private:
        int id;
        string title;
        int year;
    public:
        Media(){ id = year = 0; title = ""; }
        Media(int _id, string _title, int _year): id(_id), title(_title), year(_year) {}
//      virtual ~Media() = 0;
        void changeID(int newID){ id = newID; }
        virtual void print(ostream &out);
};

問題は、デストラクタがないと、GCCは警告をたくさん出してくることです。 class has virtual functions but non-virtual destructor しかし、それでもコンパイルされ、私のプログラムは正常に動作します。今、私はこれらの迷惑な警告を取り除きたいので、仮想デストラクタを追加することによってコンパイラを満足させますが、結果は:エラーでコンパイルできません。

undefined reference to `Media::~Media()`

デストラクタを純粋仮想化しても、問題は解決しない。 では、何が間違っていたのでしょうか?

どうすればいい?

仮想デストラクタを追加するだけでなく、定義する必要があります。

//Media.h
class Media{
    //....
    virtual ~Media() = 0;
};

//Media.cpp
#include "Media.h"
//....
Media::~Media() {};

警告が表示される理由は、派生するすべてのクラスは virtual または protected (credit @Steve) デストラクタを持つ必要があり、さもなければ基底クラスへのポインタを介してインスタンスを削除すると未定義の動作になってしまうからです。

注意事項 デストラクタが純粋なバーチャルであっても、その定義を提供する必要があります。