【问题标题】:Polymorphism with smart pointers?智能指针的多态性?
【发布时间】:2013-05-10 02:30:17
【问题描述】:

我搜索了一下,但找不到任何可以正确回答我问题的内容(我已阅读 thisthisthis

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

当我尝试使用指向实现的指针创建指向抽象类的智能指针时,即:

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

使用继承自抽象类ISpectrometerOOSpectrometer(和m_spectroWrapper 一个简单的参数)。

MSVC 给我的错误(它是法语,所以可能与英文消息不同)是

error C2259: OOSpectrometer : can't instantiate an abstract class due to the following members :

然后它列出了ISpectrometer中的纯虚函数。

【问题讨论】:

  • 如果Implementation 派生自Abstract,那应该可以。能不能给出真实的代码?
  • 你能发布完整的错误吗?
  • This,例如,工作正常
  • 怀疑OOSpectrometer没有实现ISpectrometer中声明的所有纯虚函数,也就是说它是抽象的。你能发布两者的接口吗?
  • 你应该展示真实的代码,或者它的一部分,就你得到的错误而言,它确实代表了它的意义。请提供SSCCE

标签: c++ c++11 polymorphism shared-ptr smart-pointers


【解决方案1】:

问题不在于std::shared_ptr 在多态性方面的任何破坏行为,并且此错误消息非常清楚:

错误 C2259:OOSpectrometer:由于以下成员,无法实例化抽象类:

您的类OOSpectrometer 无法实例化,因为它是抽象的。很可能,它没有实现ISpectrometer 接口中定义的所有纯虚函数。

此外,未被OOSpectrometer 覆盖的纯虚成员函数列表应该是您收到的错误消息的一部分(“由于以下成员:...”) .

【讨论】:

  • @JBL:别担心,每个人都会遇到;)
【解决方案2】:

正如错误消息所说,问题在于OOSpectrometer 仍然是抽象的,而不是它试图实例化抽象基类。

检查您是否正确覆盖了ISpectrometer 中声明的所有纯虚函数;尤其是错误消息中列出的那些。

【讨论】:

  • 同样,你是对的,我是个白痴。没有检查所有的纯虚拟都被实例化了,一直检查基类的问题...
猜你喜欢
  • 2013-05-07
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多