无法访问具有基类的shared_ptr的派生类的成员

Cannot Access Members of Derived Class with shared_ptr of BaseClass

本文关键字:ptr 派生 成员 shared 访问 基类      更新时间:2023-10-16

我有以下代码,我正试图使用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类的成员(我的研究表明,我在函数方面也会遇到同样的问题)。使用dynamic_pointer_cast似乎不起作用。我可以做些什么来访问Derived类的所有成员?

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
};