【问题标题】:make_shared and abstract polymorphismmake_shared 和抽象多态性
【发布时间】:2013-08-13 17:56:03
【问题描述】:

有什么方法可以使用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;
}

【问题讨论】:

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


    【解决方案1】:

    如果您想明确提及演员,可以使用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 / deletes 是一件好事。

    【讨论】:

    • make_sharednew 无论如何都是完全错误的 - make_shared 已经为对象分配了存储空间。
    【解决方案2】:

    我最终来到这里是因为我没有将我的继承指定为公开。所以我有:

    class Bar : Foo 
    

    代替:

    class Bar : public Foo 
    

    添加公众使shared_ptr&lt;Foo&gt; foo = make_shared&lt;Bar&gt;(...) 按预期工作

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2017-02-26
      • 2011-09-09
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多