1

子の代わりに抽象クラスを削除してもよろしいですか? これにより、すべての割り当てが解放されますか?

例として次の状況を考えてみましょう。ただし、回答をその 1 つのケースに限定しないでください。

struct A {
    virtual void fun() = 0;
};
struct B : public A {
    void fun() { /* actually doing something here. */ }
};
struct C {
    A *a;
    void OneTask() {
        // (...)
        a = new B();
    }
    void AnotherTask() { /* using fun() in some way. */ }
    ~C() { delete a; }
};

アイデアは、OneTask() の複数の可能な結果を​​持つことであり、その結果、A から継承するさまざまなクラスへのポインターが割り当てられます。B は単なる例です。そして、AnotherTask() およびクラス C の他のメソッドでそのような結果を合理的に使用する。

4

3 に答える 3

2

基本クラスに仮想デストラクタが必要です。そうしないと、派生クラスが完全に破棄されません。

struct A {
    virtual void fun() = 0;
virtual ~A()
   {
    }
};
于 2013-04-10T20:02:50.303 に答える
1

delete aはい、実際の派生型aが何を指しているのかを知らなくてもまったく問題ありません。

シヴァクマーが指摘したように、基本クラスのデストラクタを仮想化しないと、派生クラスを削除しても基本クラスのデストラクタが呼び出されません。些細な例では問題ありませんが、実際にはデストラクタを常に仮想化する必要があります。

于 2013-04-10T20:05:19.097 に答える
0

If A has a virtual destructor then both destructors of A and B are succesfully called (first B then A) ,

If you do not declare the constructor of A as virtual, then only the destructor of A is called during deletion and extended data of B may leak.

struct A {
   virtual void fun() = 0;
   virtual ~A();
};
struct B : public A {
   void fun() { /* actually doing something here. */ }
   ~B();
};
于 2013-04-10T20:06:51.073 に答える