Состояние объекта между вызовами ~Derived() и ~Base()

Вопрос

Что стандарт C++ гарантирует относительно состояния объекта во времени после выполнения деструктора производного класса, но до выполнения деструктора базового класса? (Это время, когда вызываются деструкторы подобъектов производного класса.)

Пример

#include <string>
struct Base;

struct Member {
  Member(Base *b);
  ~Member();
  Base *b_;
};

struct Base {
  virtual void f() {}
  virtual ~Base() {}
};

struct Derived : Base {
  Derived() : m(this) {}
  virtual ~Derived() {}  
  virtual void f() {}
  std::string s; 
  Member m;
};

Member::Member(Base *b) : b_(b) {}
Member::~Member() {
  // At this point, ~Derived has finished -- can we use b_ as a 
  // Derived* object (i.e. call Derived::f or access Derived::s)?
  b_->f();
}

int main() {
  Base *bd = new Derived;
  delete bd;
}

В этом примере объект Memberимеет указатель на объект Derived. которому он принадлежит, и он пытается получить доступ к этому объекту Derivedпо мере его уничтожения... даже несмотря на то, что деструктор для Derivedуже завершен.

Какая версия виртуальных функций *bdбудет вызываться, если некоторый подобъект вызывает виртуальную функцию после выполнения ~Derived(), но до ~Base() выполняет? Можно ли вообще получить доступ к *bd, когда он находится в этом состоянии?

6
задан Nate Kohl 27 June 2012 в 23:13
поделиться