1

ねえ、なぜこのプログラムの最後にベースデストラクタが2回呼び出されるのですか?

#include <iostream>
using namespace std;

class B{
public:
  B(){
    cout << "BC" << endl; x = 0;
  }
  virtual ~B(){
    cout << "BD" << endl;
  }
  void f(){
    cout << "BF" << endl;
  }
  virtual void g(){
    cout << "BG" << endl;
  }
private:
  int x;
};

class D: public B{
public:
  D(){
    cout << "dc" << endl; y = 0;
  }
  virtual ~D(){
    cout << "dd" << endl;
  }
  void f(){
    cout << "df" << endl;
  }
  virtual void g(){
    cout << "dg" << endl;
  }
private:
  int y;
};

int main(){
  B b, * bp = &b;
  D d, * dp = &d;
  bp->f();
  bp->g();
  bp = dp;
  bp->f();
  bp->g();
}
4

2 に答える 2

4

デストラクタは、対応するコンストラクタの効果を巻き戻しているかのように、順番に呼び出されます。したがって、最初に派生オブジェクトのデストラクタ、次にベースオブジェクトのデストラクタ。また、デストラクタを仮想化しても、基本クラスのデストラクタを呼び出す/呼び出さないことに影響はありません。

また、この方法で例を簡略化することもできます(このコードでは、ベースデストラクタが2回呼び出され、派生デストラクタが1回呼び出されます)

struct A {
   ~A() {
      // ...
   }
};

struct B: A {
   ~B() {
      // ...
   }
};

int main() {
   A a;
   B b;
}
于 2010-06-05T13:14:20.913 に答える
3

bが呼び出されたら、dが1回呼び出されます

Dのデストラクタが呼び出されると、自動的にBのデストラクタが呼び出されることに注意してください。これは、通常の仮想関数とは異なります。使用するために基本クラス関数を明示的に呼び出す必要がある場合。

于 2010-06-05T12:53:20.050 に答える