Programmation en C ++: quand est une fonction virtuelle non?

En C ++, juste parce que vous pensez que d'un appel de fonction particulière est lié retard ne signifie pas qu'il est. Si non déclarée avec les mêmes arguments dans les sous-classes, les fonctions de membre ne sont pas remplacées polymorphe, si oui ou non ils sont déclarés virtuel.

Une exception à la règle de déclaration identiques est que si la fonction de membre dans la classe de base renvoie un pointeur ou une référence à un objet de classe de base, une fonction de membre de substitution dans une sous-classe peut retourner un pointeur ou une référence à un objet de la sous-classe. En d'autres termes, la fonction faire une copie() est polymorphe, même si le type des deux fonctions de retour diffèrent:

Classe de base {public: // retourner une copie du courant objectBase * makeACopy () -} - SubClass de classe: Base de {public: // retourner une copie du courant objectSubClass * makeACopy () -} - fn vide (Base bc) {* Base de PCOPY = bc.makeACopy () - // procéder sur ...}

En pratique, cela est tout à fait naturel. UN faire une copie() fonction doit renvoyer un objet de type SubClass, même si elle pourrait l'emporter BaseClass :: makeACopy ().

Cette entreprise de décider silence lorsqu'une fonction est annulée et quand ne pas est une source d'erreur en C ++ - tant et si bien que la norme 2011 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 prioritaire, mais n'a pas, en fait, passer outre une fonction de classe de base pour une raison quelconque (comme un argument dépareillés) comme dans l'exemple suivant:

classe Étudiant {public: virtual void addCourseGrade (à double grade) -} - classe GradStudent: Étudiant {public: void addCourseGrade (float grade) override virtuelle -} -

Cet extrait de code génère une erreur de compilation parce que la méthode GradStudent :: addCourseGrade (float) a été déclarée override mais il n'a pas, en fait, passer outre la fonction de la classe de base Étudiant :: addCourseGrade (double) parce que les types d'arguments ne correspondent pas.

Le programmeur peut également déclarer une fonction Impossible de remplacer l'aide de la finale mot-clé, même si cette fonction se substitue une fonction antérieure de classe de base, comme l'a démontré dans le supplémentaire suivante PostDoc classe:

classe GradStudent: Étudiant {public: virtual void addCourseGrade (à double grade) final -} - classe PostDoc: GradStudent {public: virtual void addCourseGrade (à double grade) -} -

Depuis Étudiant :: addCourseGrade () est marquée finale, la déclaration de PostDoc :: addCourseGrade () génère une erreur car il tente de remplacer le Étudiant Procédé.

En outre, toute une classe peut être déclarée finale:

GradStudent de classe finale: Student publique

Cela affecte plus que les méthodes virtuelles de la classe. UN finale classe ne peut pas être héritée de tout.


» » » » Programmation en C ++: quand est une fonction virtuelle non?