19

私は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

このエラーの意味がわかりません... ブログのどこかで、これはコンパイラの警告であると読みました。どうすれば問題を解決できますか?

4

4 に答える 4

25

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

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

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

基本クラスに仮想デストラクタを追加すれば問題ありません。

class A
{
public:  
    virtual void somefunction() = 0;
    virtual ~A() = default;
}
于 2011-04-29T04:09:00.797 に答える
7

クラスAを与える:

virtual ~A() { }

そうすれば、B などの派生クラスはdeleteA*.

于 2011-04-29T04:09:23.730 に答える
4

経験則(IMHO)または要するに、基本クラスのデストラクタは、メモリリークを防ぐためにパブリックおよび仮想または保護された非仮想のいずれかである必要があります。そうすることで、派生クラスのデストラクタが呼び出され、これによりいつでもメモリリークが防止されます派生アドレス/参照を保持するベースポインタ/参照が削除されます。

于 2012-05-10T12:50:33.573 に答える
2

クラスに仮想関数がある場合、そのデストラクタも仮想である必要があります。アクセス可能なデストラクタがありますが、仮想ではありません。

于 2011-04-29T04:10:04.447 に答える