À titre d'exemple à ma question, imaginez une classe de base comme ceci:C++: Sélection d'une classe dérivée par une base à l'aide Surcharger au lieu de Cast dynamique
struct Agent {
void compete(const Agent& competitor) const = 0;
};
associés à un dérivé comme celui-ci:
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....
}
};
et le comparer à cette base:
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;
};
une d ce dérivé:
//forward needed classes.....
struct PaperAgent: public Agent {
void compete(const PaperAgent& competitor) const override {
std::cout << "I have won!" << std::endl;
}
//etc......
};
Si je tente d'utiliser ces deux méthodes en passant à la concurrence() fonctionnent une instance polymorphes Agent (référence dans ce cas), seule la première compile. Dans le second cas, le compilateur se plaint qu'il n'y a pas de fonction telle que la concurrence (const Agent &). Je comprends pourquoi cela ne fonctionne pas, mais existe-t-il une alternative qui n'exige pas dynamic_cast et est plus proche du second cas montré ci-dessus en termes de conception? Peut-être un motif de conception que je ne connais pas, ou que je n'ai jamais imaginé pourrait être utilisé pour imiter cela?
Vous pourriez trouver "double expédition" utile – Justin
Y a-t-il une raison pour laquelle vous n'en faites pas une fonction virtuelle qui ne prend aucun paramètre et que la répartition virtuelle appelle la bonne fonction? – NathanOliver
Mes sincères remerciements à Justin et double expédition :) c'était exactement ce que je cherchais. – Dincio