クラスには仮想関数とアクセス可能な非仮想デストラクタがあります 質問する

クラスには仮想関数とアクセス可能な非仮想デストラクタがあります 質問する

私のクラスは2つあります:

class A {
public:
    virtual void somefunction() = 0;
};

class B : public A {
public:
    B();
    ~B();
    void somefunction();
};

B::B() {}

void B::somefunction() {
    //  some code
}

しかし、g++ ではエラーが発生します:

class A has virtual functions and accessible non-virtual destructor
class B has virtual functions and accessible non-virtual destructor

このエラーが何なのか全く分かりません... どこかのブログで、これはコンパイラの警告だと読みました。どうすればこの問題を解決できますか?

ベストアンサー1

これは、基本クラスAに仮想デストラクタがないために発生します。たとえば、次のコードがあったとします。

int main()
{
    A* a = new B;
    delete a;
}

すると、は仮想ではないため、 のデストラクタdelete aを呼び出すことはできません。(のリソースがすべてリークされます。)BAB仮想デストラクタの詳細については、こちらをご覧ください。

基本クラスに仮想デストラクタを追加すれば問題は解決します。

class A
{
public:  
    virtual void somefunction() = 0;
    virtual ~A() = default;
}

おすすめ記事