SO是一场狗屎秀。感谢您的搭车。
一般来说,家长可以访问孩子的会员。就像CRTP。
但是,在析构函数和构造函数中访问它们会直接导致 UB。
FooImpl::FooImpl()
{
static_cast<Foo *>(this)->bar = 0;
}
这是 UB,因为
Foo
和随后的 bar
尚未构造,并且您已经访问它(并修改它!)。同样,在析构函数中 - bar
此时已经被删除。相反,您可以在 Initialize()
中创建具有相同主体的 FooImpl
方法,并在 Foo
的构造函数中调用它,那么它就是合法的。