C++ 向下广播访问函数的唯一\u ptr
如何让它工作?C++ 向下广播访问函数的唯一\u ptr,c++,unique-ptr,static-cast,downcast,C++,Unique Ptr,Static Cast,Downcast,如何让它工作?前的错误/注释行返回0 #include <iostream> #include <vector> #include <memory> using namespace std; class Base { public: void foobar() { cout << "foobar"; } }; class Derived : public Base { public:
前的错误/注释行返回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;
}
#包括
#包括
#包括
使用名称空间std;
阶级基础
{
公众:
void foobar(){cout print();
返回0;
}
要执行此强制转换,您需要在base[0]
中获取实际存储的指针,如下所示:
static_cast<Derived*>(bases[0].get())->print()
在这种情况下,您可以通过简单地使用static_cast
无效的static_cast from type'\uu gnu_cxx::\uu alloc_traits::value_type{aka std::unique_ptr}来键入'Derived*
static_cast(base[0].get())->print()
?类基的dtor也需要是虚拟的。@Danvil我已经看到了这个答案,太复杂了@Nick非常好!也许你可以做一个asnwer。我不知道get
,这里有一个非常好的答案:这不是动态投射吗?@Danvil如果你确定不是,就不必了指针可以向下投射。我不喜欢dynamic\u cast
,因为它增加了启用RTTI的需要。无论如何,尽可能避免向下投射。完全同意,但我始终认为,如果您完全确定类型,那么为什么它没有反映在您的设计中……所以至少尝试使用dynamic\u castdynamic\u-cast
是糟糕设计的标志。static\u-cast
没有那么昂贵,表明你对类型了如指掌。如果你不知道下行模式是否有效,这通常会告诉你应该重构你的设计
Interface* object = factory->CreateObject([parameter specifies type ConcreteA]);
...
static_cast<ConcreteA*>(object)->FuncOnA();