在列表中调用子对象

Call child object in a list

我有一个名为 "block" 的 class 继承自一个名为 "MainObject" 的 class。

然后我创建了一个列表并添加了"block"。我还使用迭代器循环;

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的函数。

但是由于列表存储了基的指针class,它应该只调用基的函数。将其转换为子类型并调用子类型的函数并不是一个好的设计。基地class就像一个契约,这种行为违约