使用智能指针的多态性
Polymorphism with smart pointers?
我已经搜索了一点,但找不到任何正确回答我的问题(我已经读过这个,这个和这个)
我目前正在尝试使用智能指针与多态性。
当我尝试创建一个智能指针到一个抽象类与指针的实现,即:
std::shared_ptr<Abstract> ptr = std::make_shared(new Implementation);
我的编译器(MSVC2012)显示有关创建Abstract
实例的错误,这是不可能的,因为它具有纯虚拟,即使我尝试创建指向Implementation
的指针。
在这种情况下,我可能只是完全错误地使用了智能指针,但我不知道我做错了什么(并且Visual Studio没有在我提到的行中下划线)。
我想知道是否有可能在需要多态性时使用智能指针,如果是,它必须如何完成。
注意:我知道协方差,shared_ptr是不是继承shared_ptr的类型,但我认为智能指针可以处理这个问题。
编辑:按照要求,真正的代码行是:std::shared_ptr<ISpectrometer> ret = std::make_shared<OOSpectrometer>(m_spectroWrapper);
与OOSpectrometer
继承自抽象类ISpectrometer
(和m_spectroWrapper一个简单的参数)。
MSVC给我的错误(它是法语的,所以可能与英语消息不同)是
error C2259: OOSpectrometer : can't instantiate an abstract class due to the following members :
然后列出ISpectrometer
中的纯虚函数
问题不在于std::shared_ptr
在多态性方面的任何破坏行为,并且这个错误消息非常清楚:
错误C2259:
OOSpectrometer
:由于下列成员不能实例化抽象类:
你的类OOSpectrometer
不能被实例化,因为它是抽象的。最有可能的是,它没有实现ISpectrometer
接口中定义的所有纯虚函数。
此外,未被OOSpectrometer
覆盖的纯虚拟成员函数列表应该是您获得的错误消息的一部分("由于以下成员:…")。
正如错误消息所说,问题是OOSpectrometer
仍然是抽象的,而不是它试图实例化抽象基类。
检查你是否正确地覆盖了ISpectrometer
中声明的所有纯虚函数;
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 具有智能指针的多态性
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 如何调用指针类型的方法(禁用多态性)?
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 如何避免指针超出范围(多态性)的C++分段错误
- C++ 被此代码与多态性、指针和对象切片混淆
- 在同时处理基类的多个指针时如何处理多态性?
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 与智能指针和矢量C 的多态性有关的问题
- C - 删除多态性指针
- 载体包含指向多态性类别的指针
- 集合中的智能指针多态性
- 多态性和STL容器.指针是不必要的
- 由支持多态性的值池存储,如何使用智能指针
- 如果我需要多态性,我应该使用原始指针而不是unique_ptr
- 没有指针的多态性
- 如何在使用动态多态性时避免指针
- 方法重写(没有虚拟方法或指针)是否被认为是多态性的一部分