作爲一個例子,以我的問題,設想一個基類,如下所示: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......
};
如果我試圖通過傳遞到競爭(使用這兩種方法)函數(在這種情況下,參考)代理態實例只有第一個編譯。在第二種情況下,編譯器抱怨沒有競爭的功能(const Agent &)。我明白爲什麼這不起作用,但是有沒有其他替代方案不需要dynamic_cast,並且更接近上面在設計方面顯示的第二種情況?也許我不知道的設計模式,或者我從未想象過的設計模式可以用來模擬這種模式?
您可能會發現有用的「雙重調度」 – Justin
有沒有什麼理由讓它不成爲一個不帶參數並且虛擬調度調用正確函數的虛函數? – NathanOliver
我誠摯地感謝賈斯汀和雙倍派遣:)這無疑是我所尋找的。 – Dincio