dynamic_pointer_cast从base到派生

时间:2014-09-12 18:01:48

标签: c++

我遇到std::dynamic_pointer_cast

的问题

以下是我尝试做的一个例子:

class Base
{
public:
    Base() { }
    virtual ~Base() { }
};


class Derived : public Base
{
public:
    Derived(int Data) : m_data(Data) { }
    virtual ~Derived() { }

    int GetData() { return m_data; }

private:
    int m_data;
};

然后我尝试这样做:

Derived d(42);

std::shared_ptr<Base> BasePtr = std::make_shared<Base>(d);

// DerivedPtr is nullptr here.
std::shared_ptr<Derived> DerivedPtr = std::dynamic_pointer_cast<Derived>(BasePtr);

std::cout << DerivedPtr->GetData();

是否可以从基类转换为派生类,以便上面的代码可以打印5?基指针通过Derived

std::make_shared对象构建

2 个答案:

答案 0 :(得分:4)

你应该致电

std::make_shared<Derived>(d);

这样它就会创建Derived对象。然后动态演员不会失败

答案 1 :(得分:1)

std::shared_ptr<Base> BasePtr = std::make_shared<Base>(d);

是从Base构建d的副本。所以动态演员会失败。

指向BasePtr的预定Derived的直接路线是:

std::shared_ptr<Base> BasePtr = std::make_shared<Derived>(42);

直接构造Derived对象,并将42传递给构造函数。

应用于此的动态强制转换将起作用。