在C ++中向上转换实例和在基类上调用函数

时间:2010-08-05 18:37:34

标签: c++ reference

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函数而不使用指针但是通过引用?

1 个答案:

答案 0 :(得分:1)

因为您参考临时对象初始化了pv。 “临时对象”将在下一行自动销毁,之后所有调用使用类成员的非静态方法,并且所有虚拟方法都将使应用程序崩溃。

使用指针。或者这个:

TEST (Virtualism, Tests)
{
    NonVirtual v;
    PureVirtual& pv = v.Bar().Foo(); <-- Works
    pv.Foo ();
}