RVALUE参考和多态性

rvalue reference and polymorphism

本文关键字:多态性 参考 RVALUE      更新时间:2023-10-16

当我运行以下代码时,我会得到以下运行时崩溃:

"称为纯虚拟方法终止无效异常的终止

我不明白为什么多态性在这里不起作用。请有人帮助我。

struct Base
{
    virtual void print()=0;
    virtual ~Base(){}
};
struct Derived: public Base
{
    void print(){cout << "this is Derivedn";}
};
struct Foo
{
    Foo(Base&& r): bref{r} {}
    void print(){
        bref.print();
    }
    Base& bref;
};
int main()
{
    Foo f{Derived()};
    f.print(); //it crashes here with above message
}

临时对象Derived()的寿命延伸,直到完整的表达式为 Foo f{Derived()};。在此之后,f.bref是一个悬空的参考。f.print()调用bref.print()的行为不确定。

Foo{Derived()}.print();在技术上定义得很好,但是将lvalue引用存储到传递给构造函数的rvalue引用对象可能没有意义。

bref是在Foo::print()中调用它时的悬空参考。也许这样使用unique_ptr

#include <iostream>
#include <memory>
struct Base
{
    virtual void print()=0;
    virtual ~Base(){}
};
struct Derived: public Base
{
    void print(){std::cout << "this is Derivedn";}
};
struct Foo
{
    Foo(std::unique_ptr<Base>&& r): bref{std::move(r)} {}
    void print(){
        bref->print();
    }
    std::unique_ptr<Base> bref;
};
int main()
{
    Foo f{std::unique_ptr<Derived>(new Derived)}; //or make_unique
    f.print();
}