std::shared 从基类到派生类的 std::dynamic_pointer_cast 返回 NULL

Joh*_*ohn 0 c++ casting smart-pointers shared-ptr c++11

我有一个函数,它接受类型的共享指针Base,然后std::dynamic_pointer_cast指向派生类型。但是,派生指针是 NULL,我不明白为什么。我已确保在我的基类中包含一个虚拟析构函数。我不想使用静态强制转换,因为这不能保证我的派生成员变量和函数被保留?

代码如下:

基类:

class Base
{
public:
    mType get_type()
    {
        return msg_type;
    }

    void set_type(mType type)
    {
        msg_type = type;
    }

    virtual ~cMsg() = default;
protected:
    mType msg_type;
    message msg;
};
Run Code Online (Sandbox Code Playgroud)

派生类:

class Derived : public Base
{
public:
    void set_i(int j)
    {
        i = j;
    }

    int get_i()
    {
        return i;
    }
private:
    int i;
};
Run Code Online (Sandbox Code Playgroud)

功能执行演员表:

void callback(std::shared_ptr<Base> msg_received)
{
    std::cout<< "Callback called\n";
    auto real_msg = std::dynamic_pointer_cast<Derived>(msg_received);

    if (real_msg != NULL)
    {
        std::cout << "i value is: " << real_msg->get_i() << "\n";
    }

}
Run Code Online (Sandbox Code Playgroud)

创建 Derived 对象并调用该函数的函数:

int main()
{  
    Derived test_msg;

    test_msg.set_i(1);    
    test_msg.set_type(mSystem::TEST_MSG);

    std::shared_ptr<Base> msg_ptr = std::make_shared<Base>(test_msg);    

    callback(msg_ptr);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

编辑:更正错字

Lig*_*ica 6

你完全是在切片。您的动态分配对象(由该共享指针管理)只是一个基类,是从派生类构造的副本。之后您无法“取回衍生产品”,就像您无法设计一辆仅包含其中一个车轮的构造计划的跑车一样。

我认为你的主要困惑在于认为make_shared共享某些东西。事实并非如此。它创造了一些可以分享的新东西。