gpt4 book ai didi

c++ - 在 C++ 中使用两个类层次结构实现双重分派(dispatch)

转载 作者:行者123 更新时间:2023-11-30 03:06:58 28 4
gpt4 key购买 nike

我想创建一个具有(浅层)事件层次结构的事件调度系统,可以通过(浅层)EventObservers 层次结构进行观察。我认为双分派(dispatch)将允许各种各样的事件和 EventObservers,而不必为每个组合都有一个函数。

我有这样的代码:

class BaseObserver;

class BaseEvent {
public:

virtual std::string getName() { return "BaseEvent"; }

void beObservedBy( BaseObserver* obv );

};

class BaseObserver {
public:

virtual void observe( BaseEvent* evt ) {

std::cout << "BaseObserver observing: " << evt->getName() << "." << std::endl;

}

};

void BaseEvent::beObservedBy( BaseObserver* obv ) { obv->observe( this ); }

然后定义几个测试类:

class EventA : public BaseEvent {
public:

void beObservedBy( BaseObserver* obv ) { obv->observe( this ); }

virtual std::string getName() { return "I am an EventA"; }

};

class EventB : public BaseEvent {
public:

void beObservedBy( BaseObserver* obv ) { obv->observe( this ); }

virtual std::string getName() { return "I am an EventB"; }

};

class ObserverX : public BaseObserver {

virtual void observe( EventA* evt ) { std::cout << "ObserverX spotted an EventA" << std::endl; }

};

(这一切都是在 Double dispatch/multimethods in C++Wikipedia article on double dispatch 的引导下进行的)

现在,当我调试双重调度时,派生事件类(EventA)的 beObservedBy 方法被调用,并使用派生的 EventObserver 类,但是 observe( BaseEvent* ) 函数被调用而不是 observe( EventA* )

我做错了吗?我尝试使用引用而不是指针,但没有得到喜欢。

最佳答案

问题是您在 ObserverX 中定义了 observe(EventA *evt)。这会导致函数过载。但是当你调用 observe 时,参数是 BaseEvent * 而不是 EventA *。所以调用了基类方法。

派生类中的签名必须与基类中的签名匹配,否则它不会覆盖它,它只是重载它(所以你最终得到两个函数 - 一个接受 EventA * 和一个接受 BaseEvent * 的。

尝试在 ObserverX 中定义 observe(BaseEvent *evt)

关于c++ - 在 C++ 中使用两个类层次结构实现双重分派(dispatch),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6131700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com