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

How do I get member of child class from unique pointer to base class?

本文关键字:获取 子类 成员 指针 唯一 基类      更新时间:2023-10-16

我有一个对象,它被存储为映射中基类的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. unique_ptr中获取一个指向基类的指针。

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

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

    if ( child1Ptr != nullptr )
    {
       // ... Use child1Ptr
    }
    

请确保您制作了基类virtual的析构函数。否则,当unique_ptr s被析构函数时,派生类的析构函数将永远不会被调用。此外,正如@AndyG在评论中所观察到的,如果没有任何虚拟函数,dynamic_cast将无法工作。

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