c++ - 在列表中调用子对象

标签 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();
}

最佳答案

您使用的是在列表中存储实际的 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/

相关文章:

c++ - 双重包含和仅 header 库 stbi_image

c++ - typedef type * type::* ,它是什么?

python - 此代码是否有单行解决方案

python - 如何在 Python 中将段落添加到列表中

php - PDO 不执行语句

java - 将 Java 嵌入到 C++ 应用程序中?

c++ - 为什么 glm 在转换 3D vector 时会给出错误的结果?

c# - 迭代数千个元素列表

java - 如何在不使用instanceof的情况下处理多态事件

oop - 二叉树的面试任务