私はC++を学んでおり、組み込みの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
ここで私は認識していないのですか?
ないことが問題に関連しているかどうかわからを、しかし、なぜあなたは 'SendEvent'にイベントインスタンスを渡しますし、 'SendEvent'の中でこのパラメータは無視されますが、新しい' Event'インスタンスが 'Esr'に渡されますか? – user463035818
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –
興味深い質問:答えに向かっての一歩だが、完全な答えではないので、コメント:{} is = 0;を置き換えることでEsrメソッドを純粋仮想にする。メソッド宣言で宣言します。 –