我有一个名为“ 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/