我遇到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
对象构建
答案 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
传递给构造函数。
应用于此的动态强制转换将起作用。