class PureVirtual
{
public: virtual PureVirtual& Foo () = 0;
virtual ~PureVirtual () {}
};
class SemiVirtual : public PureVirtual
{
public: PureVirtual& Foo () { printf ("foo worked."); return *this; }
virtual ~SemiVirtual () {}
};
class NonVirtual : public SemiVirtual
{
public: NonVirtual& Bar () { printf ("bar worked."); return *this; }
};
TEST (Virtualism, Tests)
{
PureVirtual& pv = NonVirtual ().Bar().Foo (); <-- Works
pv.Foo (); // <- Crashes
}
pv.Foo崩溃,因为已经处置了pv实例。我如何防止这种情况,并调用foo函数而不使用指针但是通过引用?
答案 0 :(得分:1)
因为您参考临时对象初始化了pv。 “临时对象”将在下一行自动销毁,之后所有调用使用类成员的非静态方法,并且所有虚拟方法都将使应用程序崩溃。
使用指针。或者这个:
TEST (Virtualism, Tests)
{
NonVirtual v;
PureVirtual& pv = v.Bar().Foo(); <-- Works
pv.Foo ();
}