c++ - 从基类覆盖函数

标签 c++ inheritance

我在覆盖基类的函数时遇到了一些麻烦。

这是我的游戏对象类:

namespace GameEngine {
    class GameObject {
    public:
        virtual void render() {
            std::cout << "Render Game Object" << std::endl;
        }
    };
}

这是我的 Player 类:

class Player : public GameEngine::GameObject {
public:
    void render() {
        std::cout << "Render Player" << std::endl;
    }
};

在 MainComponent.cpp 中,我有一个游戏对象 vector ,我循环遍历它们以渲染它们

Player player;
vector<GameEngine::GameObject> gameObjects;

void MainComponent::init() {
    gameObjects.push_back(player);

    gameLoop();
}

void MainComponent::render() {
    for(int i = 0; i < gameObjects.size(); i++) {
        gameObjects[i].render();
    }
}

我希望此代码输出“Render Player”,因为 gameObjects vector 中的唯一对象是 Player,但它却输出“Render Game Object”。有没有一种方法可以强制 gameObjects vector 中的 Player 对象使用 Player 渲染而不是 GameObject 渲染?

最佳答案

If a derived class is handled using pointer or reference to the base class, a call to a overridden virtual function would invoke the behavior defined in the derived class.

您必须将指向基类的指针而不是基对象值存储到 vector 中。

Player player;
vector<GameEngine::GameObject*> gameObjects;

void MainComponent::init() {
    gameObjects.push_back(&player);

    gameLoop();
}

void MainComponent::render() {
    for(int i = 0; i < gameObjects.size(); i++) {
        gameObjects[i]->render();
    }
}

关于c++ - 从基类覆盖函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381908/

相关文章:

c++ - 我不小心忘记了从函数返回值,但是当我在函数声明中返回引用时它起作用了。为什么?

C#:重写父类的一个属性

c# - 为什么一个空类会作为几个泛型类的基类?

c# - 如何在某些情况下使用不同的基类构造函数?

c++ - 创建多线程

c++ - 什么时候在 C++ 中使用静态(在未命名的命名空间上)是合适的?

C++ getline 或 cin 不接受带空格的字符串,我搜索了谷歌,但我仍然很困惑!

c++ - 为什么在通过模板进行静态调度时不需要前向声明?

swift - 在 Swift 中向现有协议(protocol)添加函数签名

c++ - 从 C++ 中的模板类继承