根据对象类调用不同的方法

时间:2018-10-14 14:30:14

标签: c++

我实际上是C ++的新手,所以我仍在尝试学习基础知识

我有活动。一个基本的和派生的。

struct Event {};

struct Derived1 : Event {};

struct Derived2: Event {
    public:
        RoundResult result;
};

...

Event fetch_event(...) {...}

某些方法返回这些事件。现在返回的副本是我想先编写的程序,然后学习如何正确处理内存。

在我的程序中,还有另一部分获取这些事件并将其传递给处理事件的类。

...
auto event = y->fetch_event(...);
x->process(event);
...

所以现在我有以下问题。我想根据我得到的派生事件结构调用不同的处理方法。

void Processor::process(Event event) {
    ...
}

void Processor::process(Derived1 event) {
    ...
}

void Processor::process(Derived2 event) {
    ...
}

现在总是调用process(Event event)。我已经看到有一种类似instanceof的Java语言,但是实际上我不确定这在C ++中是否真的成语。

所以我的问题是。首先,如果设计完全是C ++惯用的(如果不是,我很乐意得到提示)?如果是这样的话:如何在运行时实现被调用方法基于派生类?

1 个答案:

答案 0 :(得分:0)

  

首先,如果设计完全是C ++惯用的(如果没有,我会很乐意获得提示)?

不,不是。

继承的目的是消费者不必关心对象在哪里是后代。对于您的示例,处理器不应该关心事件是Event还是Derived1的实例,甚至更多,处理器也不应该知道它们是Derived1和Derived2。

您必须在Derived1 / Derived2实现中将这些差异隐藏到Processor中,例如

// In C++, class and struct have no difference other than the default visibility

class Event{
  public:
    void call() {/*Do something*/}
}

class Derived1: public Event{
  public:
    void call() {/*Do something different*/}
}

class Derived2: public Event{
  public:
    void call() {/*Do something different*/}
}

void Processor::process(Event &event){
  // ...
  event.call();
  // ...
}