右值引用和多态性

rvalue reference and polymorphism

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

"调用了纯虚方法 在没有活动异常的情况下终止调用

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

struct Base
{
    virtual void print()=0;
    virtual ~Base(){}
};

struct Derived: public Base
{
    void print(){cout << "this is Derived\n";}
};

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(); 在技术上定义得很好,但是将左值引用存储到传递给构造函数的右值引用对象中可能没有意义。

当您在 Foo::print() 中调用

bref 时,它是一个悬挂引用。也许像这样使用 unique_ptr

#include <iostream>
#include <memory>
struct Base
{
    virtual void print()=0;
    virtual ~Base(){}
};

struct Derived: public Base
{
    void print(){std::cout << "this is Derived\n";}
};

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();
}