我有一个名为" block"继承自名为" MainObject"。
的类然后我创建了一个列表并添加" 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();
}
答案 0 :(得分:2)
您正在使用在列表中存储acctual 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函数的原因。
但是当列表存储基类的指针时,它应该只调用基类的函数。将其转换为子类型并调用子类型的函数不是一个好的设计。基类就像一个契约,这种行为打破了合同。