2017-10-18 5 views
0

J'ai une classe de base et une classe dérivée dérivée de la classe de base. Chacun a une fonction ami qui surcharge operator+ comme ci-dessous. Je pensais que le compilateur lancerait une erreur à cause des fonctions ami. La fonction qui prendra en paramètre un objet de classe de base peut également prendre un objet de classe dérivée car la base fait partie de la classe dérivée. J'ai donc pensé que le compilateur montrerait une erreur car les deux fonctions peuvent prendre comme objet un objet de classe dérivé. Mais ce programme fonctionne bien. Quelqu'un peut-il expliquer pourquoi le compilateur ne montre pas une erreur?pourquoi le compilateur ne montre pas l'erreur quand j'ai deux fonctions on prendra la classe de base et on prendra la classe dérivée en tant que paramètres?

+0

downvoter. S'il vous plaît laissez-moi savoir ce qui ne va pas avec cette question. – kadina

+0

Peut-être parce que la question est trop simple et ne vaut que quelques minutes de recherche? – iBug

+0

Des exceptions sont levées. Les erreurs sont affichées. Ne pas abuser de la terminologie standard. – EJP

Répondre

2

Réponse simple: Les deux fonctions ne sont pas en conflit car elles n'ont pas la même signature. Lorsque vous appelez un avec une instance de base, il ne rentre pas dans la référence de classe dérivée, donc operator+(int, base&) sera appelée. Lorsque vous appelez l'une avec une instance dérivée, la fonction de base requiert une conversion implicite, alors que la fonction dérivée ne l'est pas. operator+(int, derived&) sera appelée.

Référence: Fonction Overload Resolution, Voir la fonction Viable et meilleure fonction viable sections.

1) il y a au moins un argument de F1 dont la conversion implicite est meilleure que la conversion implicite correspondant à cet argument de F2

Bien sûr pas de conversion implicite est « meilleure » que l'un conversion implicite, operator+(int, base&) ne sera pas appelée pour un objet dévié.

1

Pour 4 + c;, overload resolution va essayer de sélectionner le meilleur; operator+(int data, derived &obj) est une correspondance exacte, operator+(int data, base &obj) nécessite une conversion implicite (de derived à base), puis operator+(int data, derived &obj) est sélectionné et aucune ambiguïté erreur ici.