Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upcasting instance and Invoking a function on base class in C++

Tags:

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 crashes because pv instance has been disposed. How can i prevent this situation, and invoke the foo function without using pointers but by reference?

like image 543
jack-london Avatar asked Mar 09 '26 18:03

jack-london


1 Answers

Because you initialized pv with reference to temporary object. "Temporary object" will be automatically destroyed in the next line, after that all calls to non-static methods that use class members, and all virtual methods will crash the application.

Use pointers. Or this:

TEST (Virtualism, Tests)
{
    NonVirtual v;
    PureVirtual& pv = v.Bar().Foo(); <-- Works
    pv.Foo ();
}
like image 115
SigTerm Avatar answered Mar 12 '26 07:03

SigTerm



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!