为什么这个代码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
实例调用它的。
为什么会这样?
最佳答案
这是一个悬空引用。
您通过 Derived
构造函数将字段 Base::derived
初始化为对 Derived
对象的引用,但随后您访问它在 Derived
对象被销毁后的 Base
析构函数中。
在对象被销毁后访问任何对象(通过指针或引用)是未定义的行为,所以任何事情都可能发生。
关于c++ - 析构函数中函数调用的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26831060/