如果我需要多态性,我应该使用原始指针而不是
我看到了一些线程展示如何使用
unique_ptr
吗?我看到了一些线程展示如何使用
unique_ptr
实现多态行为。
我不确定这是否值得麻烦,我宁愿使用原始指针。
您能否就此发表评论,您对原始指针与智能指针在这种情况下的看法?unique_ptr
吗?unique_ptr
实现多态行为。
我不确定这是否值得麻烦,我宁愿使用原始指针。
您能否就此发表评论,您对原始指针与智能指针在这种情况下的看法?以下简单的代码展示了从多态性的角度而言,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() );
// Or using std::make_unique:
//
// std::unique_ptr<Base> pBase = std::make_unique<Derived>();
pBase->SayHello();
}
总之,观察原始指针是可以的;您必须注意的是拥有原始指针。 应该将拥有原始指针安全地包装在RAII边界内(使用unique_ptr
,shared_ptr
或某些自定义资源管理器)。
make_unique
的语法,但我认为在这种情况下这并不特别重要。 - Mr.C64使用unique_ptr
来控制被分配资源的所有权,例如在函数内部分配到自由存储器上并返回一个unique_ptr
。
如果所有权不是问题,仅使用引用来实现多态行为。即使unique_ptr
可以做同样的事情,也可以让编译器少做额外的工作。
如果所有权不是问题,在容器中使用指针来实现多态行为。你不能有一个引用的容器。
智能指针是关于所有权/生命周期的。在需要管理多态对象的生命周期时,请使用智能指针。如果只是使用该对象,请优先考虑原始引用/指针(按顺序)而非智能指针。
unique_pointer
和shared_pointer
之间没有区别。它们都以相同的方式工作。 - balki