无法使用BaseClass的shared_ptr访问派生类的成员

时间:2015-03-27 22:02:25

标签: c++ visual-studio-2013 polymorphism dynamic-memory-allocation

我有以下代码,我尝试使用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类的成员(我的研究显示我&#39;我将遇到与功能相同的问题)。使用dynamic_pointer_cast似乎不起作用。如何才能访问Derived班级的所有成员?

1 个答案:

答案 0 :(得分:3)

dynamic_pointer_cast依靠dynamic_cast正常运作。如果dynamic_cast不起作用,则dynamic_pointer_cast也无效。

在您的情况下,由于dynamic_cast没有任何Base成员函数,virtual将无效。将virtual成员函数添加到Base,或使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
};