C++ 继承基类,定义基类';原型方法,但调用子类';来自第三个对象的方法

C++ 继承基类,定义基类';原型方法,但调用子类';来自第三个对象的方法,c++,inheritance,polymorphism,prototype,base-class,C++,Inheritance,Polymorphism,Prototype,Base Class,我有一个名为“Game”的类,它的原型函数有“Update”和“Draw”,但它们没有定义。由继承“游戏”对象的对象来覆盖它们。这可能吗 “Game.h”的内容 “MyGame.h”的内容 //“MyGame.cpp”的内容 //“GameManager.h”的内容 //“GameManager.cpp”的内容 关键是最后一种方法: 当GameManager的游戏对象=MyGame而不是Game时,为什么GameManager不能调用MyGame Update()方法?在基类游戏中定义Draw和

我有一个名为“Game”的类,它的原型函数有“Update”和“Draw”,但它们没有定义。由继承“游戏”对象的对象来覆盖它们。这可能吗

“Game.h”的内容

“MyGame.h”的内容

//“MyGame.cpp”的内容

//“GameManager.h”的内容

//“GameManager.cpp”的内容

关键是最后一种方法:
当GameManager的游戏对象=MyGame而不是Game时,为什么GameManager不能调用MyGame Update()方法?

在基类
游戏
中定义
Draw
Update
virtual
方法

class Game
{
public:
   virtual void Draw() {};
};

class MyGame : public Game
{
public:
   virtual void Draw() {}
};

void callDraw(Game* game) 
{
   game->Draw();
}

//...

Game* game = new MyGame;
callDraw(game);

最后一次调用将在
MyGame
中调用该方法,尽管它是在
Game
指针上调用的。

但是我没有向类添加方法,抱歉,它们是结构化的。为了最大限度地减少每个对象之间的传输量,我定义了类/结构之外的方法。@Deukalion
structs
classes
基本上是一样的,方法不会“在对象之间传输”。好吧,不管你说什么,我猜一定有一些关联,为什么很少对象(在图形中)没有方法,而是调用SetTextColor()、CreateFont()等方法,而不仅仅是Font->SetWidth()等等。取而代之的是创建对象的外部方法,而不是让对象拥有方法。但这只是我对它的看法,也是我学到的。@Deukalion如果你不打算使用多态性(oop的一个基本组成部分),那么使用类或从游戏中派生有什么意义呢?因为所有游戏都有特定的功能,比如屏幕等等,但是如何定义游戏取决于开发者。所以我想要一个可以重新定义的结构,如果我使用GameManager知道每个游戏有两个默认方法(更新、绘制),那么游戏必须至少定义这些方法,这样我才能重新创建它。多态性变成了Update(游戏)、Update(MyGame)、Update(YourGame)等等,但是管理者应该能够在调用方法时看到这一点,通过确定它是什么对象是可能的。
#include "Game.h"

class MyGame : public Game
{
    public:
    // General stuff for my game
}

void Update(MyGame *game);
#include "MyGame.h"

void Update(MyGame *game) // does it have to be overriden/overloaded?
{
}
#include "Game.h"

class GameManager
{
    public:
    Game *game;
}

void Update(GameManager *manager);
#include "Game.h"

void Update(GameManager *manager)
{
    Update(manager->game);
}
class Game
{
public:
   virtual void Draw() {};
};

class MyGame : public Game
{
public:
   virtual void Draw() {}
};

void callDraw(Game* game) 
{
   game->Draw();
}

//...

Game* game = new MyGame;
callDraw(game);