无法使用 BaseClass 的 shared_ptr 访问 Derived Class 的成员

Cannot Access Members of Derived Class with shared_ptr of BaseClass

我尝试使用 shared_ptr.

以多态形式使用以下代码
using namespace std;
class Base
{
public:
    int ClassID; // Used only by derived classes
    string Name;
    shared_ptr<Base> Parent;  // For TreeCtrl-like hierarchy
}
class DerivedA : public Base
{
public:
    double Length;
    double Width;
    double Height;
}
class DerivedB: public Base
{
public:
    double Radius;
}

class Controller
{
public:
    vector<shared_ptr<Base>> Objects;
    void CreateObject(int class_id, string name, shared_ptr<Base> parent)
    {
        shared_ptr<Base> temp;
        switch(class_id)
        {
        case DERIVEDA: // enum definition assumed
            temp = make_shared<DerivedA>(name, parent); // constructors assumed
            break;
        case DERIVEDB:
            temp = make_shared<DerivedB>(name, parent);
            break;
        }
        Objects.push_back(temp);
    }
}

我的问题是,当我检查多态性是否工作时(使用 VS2013 的调试器),我只得到 Base class 的成员(我的研究表明我'我会遇到与功能相同的问题)。并且使用 dynamic_pointer_cast 似乎不起作用。我该怎么做才能访问 Derived class 的所有成员?

dynamic_pointer_cast 依赖于 dynamic_cast 才能正常工作。如果 dynamic_cast 不起作用,dynamic_pointer_cast 也不起作用。

在您的情况下,dynamic_cast 将不起作用,因为 Base 没有任何 virtual 成员函数。向Base添加一个virtual成员函数,或者使Base的析构函数成为虚析构函数。之后,dynamic_pointer_cast 应该可以工作。

class Base
{
  public:

    // Add this.
    virtual ~Base() {}

    int ClassID; // Used only by derived classes
    string Name;
    shared_ptr<Base> Parent;  // For TreeCtrl-like hierarchy
};