虚拟方法和覆盖

Virtual methods and overriding

我在做什么?

我正在尝试为我正在开发的游戏做一些基本的继承。这个想法是拥有一个玩家将从中继承的基础实体 class。实体 class 有一个虚拟更新或思考方法,每个 child 都会覆盖它以满足它的需要。

这是引擎处理更新循环的方式:

void Engine::update() {
  for (Entity entity : entities) {
    entity.update(deltaTime);
  }
}

代码:

Entity.hpp

#pragma once

#include "Position.hpp"
#include "AssetManager.hpp"
#include "Logger.hpp"

#define SPATIAL 1
#define VISUAL 1 << 1

class Entity {
public:
  Entity(Position *position, const char *visualPath);

  int flags;
  const char *visualPath;
  Position position;

  virtual void update(float deltaTime);
};

Entity.cpp

#include "Entity.hpp"

Entity::Entity(Position *position, const char *visualPath) {
  flags = 0;

  if (position) {
    flags |= SPATIAL;
    this->position = *position;
  }

  if (visualPath) {
    flags |= VISUAL;
    this->visualPath = visualPath;
  }
}

void Entity::update(float deltaTime){
  Logger::log("No update method");
};

Player.hpp

#pragma once

#include "../Entity.hpp"
#include "../Logger.hpp"

class Player : public Entity {
public:
  Player();

  void update(float deltaTime) override;
};

Player.cpp

#include "Player.hpp"

Player::Player() : Entity(new Position(0, 0), "assets/player.png") {}

void Player::update(float deltaTime) {
  this->position.x += 10;
  Logger::log("Player says hi");
}

有什么问题?

即使我在 Player 中覆盖了 Entity 上的更新方法,Player 仍然打印 “无更新方法”。覆盖似乎没有做任何事情。

改变这个:

void Engine::update() {
  for (Entity entity : entities) {
    entity.update(deltaTime);
  }
}

为此:

void Engine::update() {
  for (Entity& entity : entities) {
    entity.update(deltaTime);
  }
}

在最初的实现中,您的 for 循环对实体中的项目进行 复制。您可能不希望这样,但更重要的是,entity 只是基础 class 的副本,因此派生的 class 信息会丢失。通过引用传递以避免此问题和其他错误。