使用智能指针的多态性

Polymorphism with smart pointers?

本文关键字:多态性 指针 智能      更新时间:2023-10-16

我已经搜索了一点,但找不到任何正确回答我的问题(我已经读过这个,这个和这个)

我目前正在尝试使用智能指针与多态性。

当我尝试创建一个智能指针到一个抽象类与指针的实现,即:

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中声明的所有纯虚函数;