我有一个名为“ block”的类,该类继承自名为“ MainObject”的类。

然后,我创建了一个列表并添加“阻止”。我也使用迭代器循环;

std::list<MainObject> objList;

objList.push_back(block());
std::list<MainObject>::iterator p = objList.begin();


但是当我循环考虑列表时,我只能调用MainObject的功能。
这是我的循环

for (p = objList.begin(); p != objList.end(); p++){
        p->Update();
}

最佳答案

您正在使用将正确的MainObject存储在列表中,而不是继承的“ Block”对象。您应该使用基本指针:

        std::list<MainObject* > objList;

        objList.push_back(new block());
        for (p = objList.begin(); p != objList.end(); p++){
          block* b = dynamic_cast<block*>(p);
          if (b)
          b->Update();
}


如果使用std::list<MainObject>objList.push_back将创建输入参数的副本,并存储MainObject,而不是继承的类型,因此,您只能调用MainObject的函数。

但是,由于列表存储基类的指针,因此它仅应调用基类的函数。将其强制转换为子类型并调用该子类型的功能不是一个好的设计。基类就像一个契约,这种行为破坏了契约。

关于c++ - 在列表中调用子对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28053525/

10-12 00:13