-1

我搜索了一下,但找不到任何能正确回答我的问题的东西(我读过这个这个这个

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

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

std::shared_ptr<Abstract> ptr = std::make_shared(new Implementation);

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

4

2 回答 2

7

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

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

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

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

于 2013-05-15T13:36:38.290 回答
2

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

检查你是否正确地覆盖了所有在ISpectrometer;中声明的纯虚函数。特别是错误消息中列出的那些。

于 2013-05-15T13:36:51.083 回答