Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向下广播访问函数的唯一\u ptr_C++_Unique Ptr_Static Cast_Downcast - Fatal编程技术网

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();