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

标签 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. 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 被析构时,派生类的析构函数将永远不会被调用。此外,正如@AndyG 在评论中所观察到的,dynamic_cast 将无法在没有任何虚函数的情况下工作。

class Base
{
    public:
        virtual ~Base(){}

    private:
       int foo;
};

关于c++ - 如何从指向基类的唯一指针获取子类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28505409/

相关文章:

c++ - 检测到 QT UTC linux 时钟偏差。您的构建可能不完整

c++ - 整数的指数速记

c++ - gcc 会根据条件优化我的循环吗?

c++ - 执行时使用boost::asio::deadline_timer时出错

c++ - 通过引用数组传递堆栈分配的参数

c++ - 意外的 cin 行为

c++ - 使 QWidget 透明

c++ - 当你复制一个随机数引擎和随机数分布时会发生什么?

c++ - Eigen:编码风格对性能的影响

c++ - < : cannot begin a template argument list