问题
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
它被破坏时访问该对象......即使析构函数 forDerived
已经完成。
如果某个子对象在执行之后但在执行之前*bd
调用了虚函数,则将调用哪个版本的虚函数?在那个状态下访问是否合法?~Derived()
~Base()
*bd