如何从基类的唯一指针获取子类的成员?

时间:2015-02-13 17:37:47

标签: c++

我有一个对象,它在地图中存储为基类的unique_ptr。

class Base
{
    int foo;
};

map <string, unique_ptr<Base> > Objects;

但是,对象实际上是不同的子类。

class Child1 : public Base
{
    int bar1;   
};
class Child2 : public Base;
{
    int bar2;
};

Objects.insert(make_pair("Child1", unique_ptr<Base>(new Child1())));
Objects.insert(make_pair("Child2", unique_ptr<Base>(new Child2())));

现在,在代码中的某个地方,我想访问Child1的成员变量,该变量对于该类是唯一的。

cout << "Bar1 is:" << Objects["Child1"]->bar1 << endl;

但我收到错误:

ERROR: 'class Base' has no member 'bar1'

所以我尝试使用dynamic_cast,但当然,你不能在unique_ptr上使用dynamic_cast。

那我该怎么办?

1 个答案:

答案 0 :(得分:3)

  1. unique_ptr获取指向基类的指针。

    Base* basePtr = Objects["Child1"].get();
    
  2. 在指针上执行dynamic_cast

    Child1* child1Ptr = dynamic_cast<Child1*>(basePtr);
    
  3. 访问Child1类的成员。

    if ( child1Ptr != nullptr )
    {
       // ... Use child1Ptr
    }
    
  4. 确保您创建基类virtual的析构函数。否则,当unique_ptr被破坏时,永远不会调用派生类的析构函数。另外,正如@AndyG在评论中观察到的那样,dynamic_cast在没有任何虚函数的情况下无法工作。

    class Base
    {
        public:
            virtual ~Base(){}
    
        private:
           int foo;
    };