具有智能指针的多态性?

时间:2013-05-15 13:29:59

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

我搜索了一下,但找不到任何能正确回答我问题的内容(我看过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);

OOSpectrometer继承抽象类ISpectrometer(和m_spectroWrapper一个简单的参数)。

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

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

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

2 个答案:

答案 0 :(得分:7)

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

  

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

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

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

答案 1 :(得分:2)

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

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