RVALUE参考和多态性
rvalue reference and polymorphism
当我运行以下代码时,我会得到以下运行时崩溃:
"称为纯虚拟方法终止无效异常的终止
我不明白为什么多态性在这里不起作用。请有人帮助我。
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();
}
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- 从基类调用函数的多态性
- RVALUE参考和多态性
- 多态性和与参考文献的切片