c++ - 右值引用和多态性

标签 c++ virtual-functions rvalue-reference object-lifetime temporary-objects

当我运行以下代码时,出现以下运行时崩溃:

"调用的纯虚方法 在没有事件异常的情况下终止调用”

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

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

关于c++ - 右值引用和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56873162/

相关文章:

c++ - 循环求和不显示实际结果?

virtual-functions - Swift 有动态调度和虚方法吗?

c++ - 标记为 `virtual final` 的基类方法是否会引入额外的开销?

C++11 右值和 move 语义混淆(return 语句)

c++ - 类型 'const char*' 和 'const char [93]' 的二进制操作数无效

c++ - 重载 * 乘法运算符两次作为成员函数?

c++ - 使用 glTexImage2D 函数缺少绿色分量,为什么?

c++ - 基于集合派生对象中存在的类型选择行为的模式

c++ - 使用右值引用成员?

c++ - 当我们使用右值引用时到底发生了什么,std::move 是如何工作的?