C ++如何具有相同方法的单独版本?

时间:2018-07-04 18:48:15

标签: c++ oop inheritance overloading abstract

很抱歉,如果我不知道我要完成的工作的正确词。

基本上,我有一个仅具有单个成员的事件处理程序对象。该成员是一个Stage对象。

当事件处理程序接收到一个事件时,我希望它仅使用舞台对象来调用相关方法。例如:

Event event; //this event is not part of my code, but rather the library I'm using.

Stage s;                    // my custom class object

EventHandler event_handler; //also my custom class object
event_handler.stage = &s;

if(event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}

所以我要完成的工作是,随着时间的推移,我的程序将进入单独的作用域,并且我希望每个作用域都可以访问event_handler,以便它们可以执行以下操作:

void some_other_scope(EventHandler* eh) {
    Stage* some_new_stage = new Stage(...);
    eh->stage = some_new_stage;
}

这样,原始事件代码将保持不变,并且事件处理程序将在与原始对象不同的对象上调用handle_shutdown。

所以我要做的是重载handle_shutdown方法,以便可以有不同的实现。我知道基本的重载是如何工作的,可以通过指定不同的参数来完成,但是有什么方法可以基于创建对象的文件对同一个类方法进行不同的定义?

我希望有多个文件,每个文件都有自己的some_other_scope()函数,每个文件都可以根据该文件的需要重新定义handle_shutdown方法以执行不同的操作。

我敢肯定有一种方法可以做我想做的事,我只是不知道使用正确的单词。

1 个答案:

答案 0 :(得分:1)

似乎您想使用多态性:

class IStage
{
public:
    virtual ~IStage() = default;
    virtual void handle_shutdown() = 0;
    // ...
};

class Stage1 : public IStage
{
public:
    void handle_shutdown() override { /*Implementation1*/ }
    // ...
};

class Stage2 : public IStage
{
public:
    void handle_shutdown() override { /*Implementation1*/ }
    // ...
};

然后

struct EventHandler
{
    std::unique_ptr<IStage> stage;
    // ...
};

EventHandler event_handler;
event_handler.stage = std::make_unique<Stage1>();

if (event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}

// Later
event_handler.stage = std::make_unique<Stage2>();

if (event == SHUTDOWN) {
    event_handler.stage->handle_shutdown();
}