如果我需要多态,我应该使用原始指针而不是unique_ptr吗?

时间:2014-02-28 22:17:57

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

如果我需要多态,我应该使用原始指针而不是unique_ptr吗?

我看到一些线程显示如何使用unique_ptr进行多态行为。 我不确定这是值得的麻烦,我宁愿留下原始指针。 在这种情况下,您能否对此进行评论,您对原始指针和智能指针的看法?

3 个答案:

答案 0 :(得分:10)

以下简单代码显示std::unique_ptr从多态性的角度来看效果很好,打印"Hello from Derived."

#include <iostream>
#include <memory>
using std::cout;

struct Base 
{
    virtual ~Base() { }

    virtual void SayHello()
    {
        cout << "Hello from Base.\n";
    }
};

struct Derived : public Base
{
    void SayHello() override
    {
        cout << "Hello from Derived.\n";
    }
};

int main()
{
    std::unique_ptr<Base> pBase( new Derived() );    
    pBase->SayHello();
}

无论如何,观察原始指针很好;您必须注意的是拥有原始指针。拥有原始指针应安全地包含在RAII边界内(使用unique_ptrshared_ptr或某些自定义资源管理器。)

答案 1 :(得分:1)

智能指针是关于所有权/生命周期。在需要管理多态对象的生命周期的地方,请使用智能指针。如果您只是使用该对象,则优先选择原始引用/指针(按此顺序)而不是智能指针。

答案 2 :(得分:1)

  • 使用unique_ptr来控制已分配资源的所有权,例如在函数内的免费商店中分配并返回unique_ptr

  • 如果所有权不是问题,则仅使用多态行为的引用。即使unique_ptr执行相同操作,也可以使编译器免于额外的工作。

  • 如果所有权不是问题,请在容器内使用指针来表示多态行为。你不能有一个参考容器。