Vidéo: C# Tutorial - Full Course for Beginners 2024
En C ++, ce n'est pas parce que vous pensez qu'un appel de fonction particulier est lié en retard. Si elles ne sont pas déclarées avec les mêmes arguments dans les sous-classes, les fonctions membres ne sont pas remplacées de façon polymorphique, qu'elles soient ou non déclarées virtuelles.
Une exception à la règle de déclaration identique est que si la fonction membre de la classe de base renvoie un pointeur ou une référence à un objet de classe de base, une fonction membre surchargée peut renvoyer un pointeur ou une référence à un objet de la sous-classe. En d'autres termes, la fonction makeACopy () est polymorphe, même si le type de retour des deux fonctions diffère:
class Base {public: // retourne une copie de l'objet courant Base * makeACopy ();}; class SubClass: public Base {public: // renvoie une copie de l'objet courant SubClass * makeACopy ();}; void fn (Base & bc) {Base * pCopie = bc. faire une copie(); // continuez …}
En pratique, c'est assez naturel. Une fonction makeACopy () doit renvoyer un objet de type SubClass , même s'il peut surcharger BaseClass:: makeACopy () .
Cette fonction de décider silencieusement quand une fonction est surchargée et quand elle ne l'est pas est une source d'erreur en C ++; si bien que la norme 2011 a introduit le descripteur override que le programmeur peut utiliser pour indiquer son intention de remplacer une fonction de classe de base.
C ++ génère une erreur de compilation si une fonction est déclarée override mais ne remplace pas, en fait, une fonction de classe de base pour une raison quelconque (comme un argument mésapparié) comme dans l'exemple suivant: >
Cet extrait génère une erreur de compilation car la méthode GradStudent:: addCourseGrade (float) a été déclarée override mais en fait, elle ne remplace pas la fonction de classe de base Student:: addCourseGrade (double) car les types d'arguments don ' t match.
final , même si cette fonction remplace elle-même certaines fonctions de classe de base antérieures, comme démontré dans le > PostDoc class: class GradStudent: public Étudiant {public: virtual void addCourseGrade (double grade) final;}; class PostDoc: public GradStudent {public: virtual void addCourseGrade (double notation);}; Comme Etudiant:: addCourseGrade () est marqué final
,
la déclaration de PostDoc:: addCourseGrade () génère une erreur car il tente de surcharger la méthode Student .
class GradStudent final: public Student Ceci affecte plus que les méthodes virtuelles de la classe. Une classe
final
ne peut pas être héritée du tout.