This question already has answers here:
std::unique_ptr with derived class
(1个答案)
“Downcasting” unique_ptr<Base> to unique_ptr<Derived>
(1个答案)
6年前关闭。
如何使其运作?
编辑:
我同意@Tietbohl的观点,即
例如,假设您有一个工厂方法,该方法创建具有特定接口(interface)的对象,但是提供了一个参数,指示您需要特定的具体类,然后需要对返回的对象执行操作:
在这种情况下,只需使用
(1个答案)
“Downcasting” unique_ptr<Base> to unique_ptr<Derived>
(1个答案)
6年前关闭。
如何使其运作?
return 0;
之前的错误/注释行#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Base
{
public:
void foobar() { cout << "foobar"; }
};
class Derived : public Base
{
public:
void print() { cout << "hello world!"; }
};
int main(int argc, char *argv[])
{
vector<unique_ptr<Base>> bases;
bases.push_back(unique_ptr<Base> (new Derived()));
//ok
bases[0]->foobar();
//error
//how can I make this works?
static_cast<Derived*> (bases[0])->print();
return 0;
}
最佳答案
为此,您需要像这样在base[0]
中获取实际存储的指针:
static_cast<Derived*>(bases[0].get())->print()
编辑:
我同意@Tietbohl的观点,即
dynamic_cast
更安全,向下转换可能表明设计不佳。但是,在某些情况下,向下转换很有意义,并且可以肯定它是安全的。例如,假设您有一个工厂方法,该方法创建具有特定接口(interface)的对象,但是提供了一个参数,指示您需要特定的具体类,然后需要对返回的对象执行操作:
Interface* object = factory->CreateObject([parameter specifies type ConcreteA]);
...
static_cast<ConcreteA*>(object)->FuncOnA();
在这种情况下,只需使用
static_cast
即可避免RTTI的复杂性。07-27 13:35