为什么此代码compile并正确打印"Derived"
?
template <class Derived>
class Base
{
public:
Base(Derived& d) : derived(d) {}
void f() { std::cout << "Base\n"; }
virtual ~Base() { derived.f(); }
private:
Derived& derived;
};
class Derived : public Base<Derived>
{
public:
Derived() : Base<Derived>(*this) {}
void f() { std::cout << "Derived\n"; }
};
int main()
{
Derived d;
}
但是making Base::f
virtual
或Derived::f
和Base::f
虚拟原因"Base"
都要打印。此外,将Derived::f
更改为virtual
会产生Invalid memory reference (SIGSEGV)
。我希望其他两个案例打印“Derived”,因为我是从Derived
实例调用它。
为什么会这样?
答案 0 :(得分:2)
这是一个悬空参考。
您可以通过Base::derived
构造函数将字段Derived
初始化为Derived
对象的引用,然后在Base
析构函数之后访问Derived
构造函数1}}对象已被破坏。
在销毁任何对象(通过指针或引用)之后访问它是未定义的行为,因此可能发生任何事情。