有没有一种方法可以使用派生 class 中的数据调用基 class 指针的方法?

Is there a way to call method with base class pointer that uses the data in derived class?

(抱歉我的英语不好)

我有一个基础 class,其中包含 Drawable 对象上的指针向量,以及使用来自该向量的数据的方法 draw()。

class GameObject
{
protected:
    std::vector<Drawable*> drawable;
...

void GameObject::draw() { for (const auto& object : drawable) window.draw(*object); }

在派生的 classes 中,我希望能够添加一些 Drawable 对象

class Player : public GameObject
{
protected:
    RectangleShape shape;
...

Player::Player(float x, float y, float z)
{
    shape.setPosition [...]
    drawable.push_back(&shape);
...

并使用基class指针

的方法绘制它们
std::vector<GameObject*> gameObjects;
...
for (auto& gameObject : gameObjects) gameObject->draw();

程序崩溃(我想是因为基class对派生class中的矢量数据一无所知)。 我知道我可以使这个方法成为纯虚拟的并在派生的 classes 中定义它,但这并不方便。也许还有另一种更类似于此的方式?

更新:

Level::Level()
{
    player = Player(500.f, 500.f); //Player player; in header file
    gameObjects.push_back(&player);
}

void Level::display()
{
    for (auto gameObject : gameObjects) gameObject->draw();
}

问题出在您编辑添加的代码中 - 看起来我的 crystal 球今天工作正常。

您正在创建一个临时 Player 并将其移动到 player 成员变量中。最终得到一个向量,其中包含临时 Playershape 的地址,它立即被销毁,留下一个悬空指针。

使用 ctor-initializer-list 避免移动:

Level::Level()
    : player(500.f, 500.f /* where did Z go? */)
{
    gameObjects.push_back(&player);
}

并禁用赋值运算符以防止在其他地方不小心这样做:

class Player
{
    // ...

    Player& operator=(const Player&) = delete;
    Player& operator=(Player&&) = delete;
};