キャスト:C++:ダイナミックオーバーロードの代わりに使用してベースを派生クラスの選択は、そのように、基本クラスを想像して、私の質問に一例として
:次のように派生してstruct Agent {
void compete(const Agent& competitor) const = 0;
};
関連
struct RockAgent;
struct PaperAgent;
struct ScissorsAgent: public Agent {
void compete(const Agent& competitor) const override {
if(dynamic_cast<const RockAgent*>(&competitor))
std::cout << "I have lost" << std::endl;
else if(dynamic_cast<const PaperAgent*>(&competitor))
std::cout << "I have won!" << std::endl;
//etc....
}
};
そして、このベースにそれを比較:
struct PaperAgent;
struct RockAgent;
struct ScissorsAgent;
struct Agent {
void compete(const PaperAgent& competitor) const = 0;
void compete(const RockAgent& competitor) const = 0;
void compete(const ScissorsAgent& competitor) const = 0;
};
Dこれは派生:
//forward needed classes.....
struct PaperAgent: public Agent {
void compete(const PaperAgent& competitor) const override {
std::cout << "I have won!" << std::endl;
}
//etc......
};
を私は最初の1は、コンパイル()(この場合の基準)のエージェント多型のインスタンスを機能競うために渡すことで、これらの2つの方法を使用しようとします。 2番目のケースでは、コンパイラはcompete(const Agent &)のような機能がないと不平を言う。私はなぜこれがうまくいかないのか理解していますが、dynamic_castを必要とせず、上に示した2番目のケースに近いデザインがあります。私が気づいていないデザインパターンや、想像したことのないデザインパターンを使ってこれをエミュレートすることは可能でしょうか?
「ダブルディスパッチ」が便利かもしれません – Justin
パラメータを取らず仮想ディスパッチが正しい機能を呼び出す仮想機能にしない理由はありますか? – NathanOliver
ジャスティンと二重のディスパッチに心から感謝しています:)私が探していたのはexacltlyでした。 – Dincio