dynamic_pointer_cast从基到派生

dynamic_pointer_cast from base to derived

本文关键字:派生 cast pointer dynamic      更新时间:2023-10-16

我的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?通过std::make_sharedDerived对象构造基指针

您应该调用

std::make_shared<Derived>(d);

以便它将创建派生对象。那么动态转换不会使失败

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

是从CCD_ 6复制构建CCD_。因此,动态铸造将失败。

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

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

其直接构造CCD_ 9对象,其中CCD_。

应用于此的动态演员阵容将起作用。