【发布时间】:2016-08-19 00:47:56
【问题描述】:
我有这种情况:
#include <iostream>
struct B { virtual void f() { std::cout << "base"; } };
struct A {
~A() {
b->f();
}
B *b;
};
struct Bd : B {
Bd():a{this}{ }
~Bd() { }
virtual void f() { std::cout << "derived"; }
A a;
};
int main() {
Bd d;
}
是否保证这会打印“派生”?
【问题讨论】:
-
我认为它要么调用
B::f,要么调用未定义的行为。对象的生命周期正式结束when its destructors begins,所以当A::~A调用b->f();时,b的派生部分已经死亡。 -
也看看this
-
@Quentin 那句话看起来根本不对。您绝对可以从其自己的析构函数中访问对象,这与禁止在其生命周期结束后访问它的规定不一致。