在列表中调用子对象

时间:2015-01-20 19:22:33

标签: c++ list oop pointers

我有一个名为" 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();
}

1 个答案:

答案 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函数的原因。

但是当列表存储基类的指针时,它应该只调用基类的函数。将其转换为子类型并调用子类型的函数不是一个好的设计。基类就像一个契约,这种行为打破了合同。