базовый деструктор вызывается дважды после производного объекта? - PullRequest
0 голосов
/ 05 июня 2010

Эй, почему базовый деструктор вызывается дважды в конце этой программы?

#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();
}

Ответы [ 2 ]

3 голосов
/ 05 июня 2010

Деструкторы вызываются по порядку, как если бы они раскручивали эффекты соответствующих конструкторов. Итак, сначала деструкторы производных объектов, затем деструкторы базовых объектов. А виртуализация деструкторов не влияет на вызов / не вызов деструктора базовый класс .

Также стоит упомянуть, что ваш пример можно упростить таким образом (этот код также приводит к двойному вызову базового деструктора и однократного получения деструктора) :

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

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

int main() {
   A a;
   B b;
}
2 голосов
/ 05 июня 2010

Один раз для b и один раз для d

Обратите внимание: когда вызываемый деструктор D автоматически вызывает деструктор B, он отличается от обычных виртуальных функций. где вам нужно явно вызвать функцию базового класса, чтобы использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...