我有一个名为“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();
}
最佳答案
您使用的是在列表中存储实际的 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/