C++ 在扩展已知类的未知类内调用函数

C++ 在扩展已知类的未知类内调用函数,c++,C++,正如标题所述,我有以下用户可以扩展的“基类”: class BaseScene { private: bool sceneloop = false; public: virtual void Start(); virtual void EventHandler(SDL_Event event); virtual void Update(); virtual void Draw(); void _toggleLoopMode() { scenel

正如标题所述,我有以下用户可以扩展的“基类”:

class BaseScene
{
private:
    bool sceneloop = false;

public:
    virtual void Start();
    virtual void EventHandler(SDL_Event event);
    virtual void Update();
    virtual void Draw();

    void _toggleLoopMode() { sceneloop = !sceneloop; }
    bool _sceneloop() { return sceneloop; }

};
我的问题是,我不知道用户为他的类选择了什么名称,所以如何从未知类中的主类调用已知方法(如Start或EventHandler)

我不知道但用户知道的类的示例可以是:

class SomeFunnyRandomName : public BaseScene
{
public:
    void Start();
    void Eventhandler(SDL_Event event);
    void Update();
    void Draw();
};
因此,形成我需要在“SomeFunnyRandomName”中调用Start()的主类,但不包括:


如果您可以包含代码,它将非常有用(但不是必需的)。

您可以获取一个指向
BaseScene
的引用或指针,并调用该方法。调用方传递其派生类的实例

class UsesScene {
    BaseScene & scene;
public:
    UsesScene(BaseScene & scene) : scene(scene) {}

    void doStuff() { scene.Start(); scene.Update(); }
    /*... etc*/ 
};

int main() {
    SomeFunnyRandomName scene;
    UsesScene usesScene(scene);
    usesScene.doStuff();
}

使用虚拟方法?可能显示您试图实现的代码?
SomeFunnyRandomName sfrn;sftrn.Start()
应该可以工作,因为您的代码目前还处于运行状态,我仍然不明白您想要做什么。现在,由于您不调用类,只调用函数,因此在调用函数时不需要命名类(除非它是静态成员函数,但这里不需要这样的东西)。那么什么时候需要命名一个类呢?当您创建该类的对象时。我看不出您可能需要在哪里创建对象。有一个由用户创建的对象,其类继承了
BaseScene
。您只需要一个指向该对象的指针或引用就可以调用其成员函数。(续)在
BaseScene
的所有非静态成员函数中,有一个指向该对象的指针,称为
this
。因此,您可以在此上调用成员函数。如果函数是虚拟的,它将在用户的类中调用正确的函数。谢谢你的回答,但是,这不能解决我的问题。在我的例子中,不是用户调用BaseSecene,而是我的代码调用扩展基类的用户类。(es.my code->user_class:BaseScene)我的问题是我不知道如何接受未知类并调用已知方法(es.UserScene在我的未知类中,Start()是我已知的方法)@user13767094我想你误解了答案:
usescene
(而不是
UserScene
)是你这边的代码,它只知道
BaseScene
SomeFunnyRandomName
,用户类型,仅出现在用户侧的
main
中。@Quentin我尝试过你的解决方案,但我只能访问我的BaseSecene函数,不能访问SomeFunnyRandomName函数。如果我在SomeFunnyRandomName::Start()中打印“Hello”,在BaseSecene::Start()中打印“Hi”,则您的代码只运行第二个,而不是第一个。@Pinnaker
class UsesScene {
    BaseScene & scene;
public:
    UsesScene(BaseScene & scene) : scene(scene) {}

    void doStuff() { scene.Start(); scene.Update(); }
    /*... etc*/ 
};

int main() {
    SomeFunnyRandomName scene;
    UsesScene usesScene(scene);
    usesScene.doStuff();
}