JBL*_*JBL -1 c++ polymorphism smart-pointers shared-ptr c++11
我搜索了一下但找不到任何正确回答我的问题的东西(我已经读过这个,这个和这个)
我目前正在尝试使用具有多态性的智能指针.
当我尝试使用指向实现的指针创建指向抽象类的智能指针时,即:
std::shared_ptr<Abstract> ptr = std::make_shared(new Implementation);
Run Code Online (Sandbox Code Playgroud)
我的编译器(MSVC2012)显示有关创建Abstract不可能的实例的错误,因为它具有纯虚拟,即使我尝试创建指针Implementation.
在这种情况下,我可能只是使用完全错误的智能指针,但后来我不知道我做错了什么(并且Visual Studio没有强调我提到的行).
我想知道当需要多态时是否可以使用智能指针,如果是,那么必须如何完成.
注意:我知道协方差,以及shared_ptr 不是继承shared_ptr的类型,但认为智能指针会处理这个问题.
编辑:
根据要求,真正的代码行是:
std::shared_ptr<ISpectrometer> ret = std::make_shared<OOSpectrometer>(m_spectroWrapper);
Run Code Online (Sandbox Code Playgroud)
随着OOSpectrometer从抽象类继承ISpectrometer(和m_spectroWrapper简单的参数).
错误MSVC给我(它是法语,所以可能与英语消息不同)是
error C2259: OOSpectrometer : can't instantiate an abstract class due to the following members :
Run Code Online (Sandbox Code Playgroud)
然后它列出了所在的纯虚函数ISpectrometer.
问题不std::shared_ptr在于多态性的任何破坏行为,并且此错误消息非常清楚:
错误C2259 ::
OOSpectrometer由于以下成员,无法实例化抽象类:
您的类OOSpectrometer无法实例化,因为它是抽象的.最有可能的是,它没有实现ISpectrometer界面中定义的所有纯虚函数.
此外,未被覆盖的纯虚拟成员函数列表OOSpectrometer应该是您获取的错误消息的一部分(" 由于以下成员:... ").