我实际上是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 ++惯用的(如果不是,我很乐意得到提示)?如果是这样的话:如何在运行时实现被调用方法基于派生类?
答案 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();
// ...
}