如何在 C++ 中从父 class 变量调用子 class 的重载方法

How does one call an overloaded method from a child class from a parent class variable in C++

现在,这个问题似乎已经被问过数百万次了,但我认为我的是个特例...

无论如何,我有这个 class:

class Personality {
public:
    Personality() {};
    virtual void Start () {

    }
    virtual void Update () {

    }
    virtual ~Personality() {};
};

我有这个覆盖版本:

class example : public Personality {
public:
    example() {};
    void Start (FuzzyGame::FuzzyObject& o);
    void Update (FuzzyGame::FuzzyObject& o);
    ~example() {};
};

然后我有我的 GameObject class(又名 FuzzyObject):

class FuzzyObject {
public:
    std::string name;
    std::string tag;
    std::string type;
    FuzzyForm xform;
    bool enabled = false;

    std::string className;
    Personality Pclass;

    std::string path;
    std::string texPath;
    MD2Object animMesh;
    bool isMD2;

    LightData light;
    CamData cam;

    GLuint Texture;
    BillboardType BBType;
};

我想知道的是:是否有可能从 example() class 调用一个方法,比如 Update(),使用这个基础实例 class,使用一些将它附加到("FuzzyObject")的 class 传递给该函数的方法?

Personality Pclass;

基本上,这就是我可以为我的游戏引擎创建基于 C++ 的脚本系统的全部内容。

更新: 通过阅读我批准的答案,我目前实际上正在使用这种方式:

example e;
e.Start(/*whatever should be here*/); 

但我发现直接输入向量元素会导致段错误。我尝试了一个指向向量元素的指针,它起作用了。有点...任何人都知道为什么要像这样输入向量的元素:

example.Start(&myArray<FuzzyObject>[i]); //assuming this is in a for-loop

进入我的重载函数修改了我向量中的所有元素?!

又名。当 运行 更新一个对象(代码修改变换组件以将受影响的对象偏移 0.1)时,它也会偏移所有其他对象,这显然不是我想要的。有人知道这种奇怪行为的原因吗?

我只能假设问题的根源是一些奇怪的内存分配问题,只有 C++ 会出现...:D

更新 2: 我终于找到了我的另一个问题的根源(更新 1),这是真正愚蠢的事情,只会发生在 OpenGL 中......:D

事实证明它似乎在 std::vector 中修改整个 bang lot 的原因实际上根本不是向量指针;这是因为我忘记在绘制下一个对象之前加载单位矩阵!同样,当一个人被移动时,之前的转变让其他人决定像醉酒的水手一样漂流……;)

同样,很抱歉浪费你们的时间...:D 我早该知道先重置矩阵! :)

绝对不会。

你的代码有几个问题:

首先,您的 StartUpdate 方法没有相同的 signature. You'll need them to have the same signature to use any sort of polymorphic behavior. Otherwise it's an overload not an override (and a hidden 方法。

其次,要使用派生的class方法,实例实际上必须是派生的class类型

意思是,您必须持有 example:

的一个实例
example e;
e.Start(/*whatever should be here*/);

或者使用多态Personality来保存example的一个实例:

Personality *p = new example();
p->Start(); // calls example's Start() in case it has a parameterless Start() method

梯子也可以做参考:

example e;
Personality &p = e;
p.Start(); // calls example's Start() in case it has a parameterless Start() method

当然,您可以在最后一个示例中调用 e.Start(),但想法是这三行实际上可能位于代码的不同位置。


附带说明一下,您要求编译器执行的操作在逻辑上实际上是不可能的。

如果 FuzzyCode 依赖于基础 Personality 并且不依赖于派生的 example 任何方式,那么 example 中的更改是不可能的影响 FuzzyCode.