我正在学习C++,并希望构建类似于C#事件的东西来处理嵌入式C++项目中的中断。
到目前为止,我已经想出了一个几乎符合我的要求的解决方案。然而,我需要一些关于多态性的帮助。以下代码片段是重新现我的情况的最小示例:
预期控制台输出:
到目前为止,我已经想出了一个几乎符合我的要求的解决方案。然而,我需要一些关于多态性的帮助。以下代码片段是重新现我的情况的最小示例:
#include <iostream>
struct Event
{ };
struct EventHandler
{
virtual void Esr (const Event& I) { }
};
struct EventSender
{
EventSender (EventHandler& Handler) : _Handler (Handler) { }
template <typename T>
void SendEvent (const T&) const
{
_Handler.Esr (T ());
}
EventHandler& _Handler;
};
struct SpecialEvent : public Event
{ };
struct MyHandler : public EventHandler
{
void Esr (const Event& I) override { std::cout << "Event" << std::endl; }
void Esr (const SpecialEvent& I) { std::cout << "SpecialEvent" << std::endl; }
};
int main()
{
MyHandler handler;
EventSender sender (handler);
/* Invoke directly */
handler.Esr (Event ());
handler.Esr (SpecialEvent ());
/* Invoke indirectly */
sender.SendEvent (Event ());
sender.SendEvent (SpecialEvent ()); // Expected cout msg: "SpecialEvent"
return 0;
}
预期控制台输出:
Event
SpecialEvent
Event
SpecialEvent
实际控制台输出:
Event
SpecialEvent
Event
Event
编译器/链接器在这里做了我不知道的什么处理?