make_shared和抽象多态

时间:2013-08-12 12:13:00

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

对于抽象类型,我有什么方法可以使用make_shared代替shared_ptr吗?

示例:

#include <memory>
#include <vector>

class Foo
{
public:
    virtual void fooFunc() = 0;
};

class Bar : public Foo
{
public:
    void fooFunc() {};
};

int main()
{
    std::vector< std::shared_ptr<Foo> > vec;

    vec.push_back(std::shared_ptr<Foo>(new Bar()));
    //vec.push_back(std::make_shared<Foo>(new Bar())); //doesn't work because Foo is abstract

    return 0;
}

2 个答案:

答案 0 :(得分:3)

如果您想明确提及演员表,可以使用std::static_pointer_cast

int main()
{
    std::vector<std::shared_ptr<Foo>> vec;
    vec.push_back(std::static_pointer_cast<Foo>(std::make_shared<Bar>()));
}

但没有它也可以:

vec.push_back(std::make_shared<Bar>());

以下是演示行为的演示:Demo

我建议不要将std::make_sharednew结合使用。这里有一个性能问题,在我看来,避免不平衡new / delete是件好事。

答案 1 :(得分:1)

我到这里结束了,因为我没有将继承指定为公开。所以我有:

class Bar : Foo 

代替:

class Bar : public Foo 

增加公众参与shared_ptr<Foo> foo = make_shared<Bar>(...)的工作