Что стандарт 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
, когда он находится в этом состоянии?