Outils d'utilisateurs

Outils du Site


fonction_virtuel

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

fonction_virtuel [2014/12/08 20:52]
gbdivers
fonction_virtuel [2018/07/20 23:41] (Version actuelle)
winjerome Ajout des liens vers les chapitres précédent/suivant
Ligne 1: Ligne 1:
  
-^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^+[[polymorphisme_et_pointeurs|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[invariant_de_classe|Chapitre suivant]] ^
  
 ====== Fonctions virtuelles ====== ====== Fonctions virtuelles ======
Ligne 37: Ligne 37:
 </code> </code>
  
-On voit ici un problème majeur : si on définie des variables membres publiques et qu'on les utilise en dehors des classes, on a besoin de connaître le type réel pour utiliser ces membres. Autrement dit, si on créé une classe Derived, on a besoin de savoir que l'on a créé ce type d'objet pour accéder à la variable membre j.+On voit ici un problème majeur : si on définit des variables membres publiques et qu'on les utilise en dehors des classes, on a besoin de connaître le type réel pour utiliser ces membres. Autrement dit, si on crée une classe Derived, on a besoin de savoir que l'on a créé ce type d'objet pour accéder à la variable membre j.
  
 On ne respecte pas le principe de substitution de Liskov, puisque que si on a besoin de connaître le type réel de l'objet, on perd la substituabilité. La classe ne respecte pas Liskov. On ne respecte pas le principe de substitution de Liskov, puisque que si on a besoin de connaître le type réel de l'objet, on perd la substituabilité. La classe ne respecte pas Liskov.
  
-On comprend mieux un autre principe expliqué plus tôt, le principe d'encapsulation. Si on pense en termes de données encapsulées, on rencontre un problème de substituabilité. Il faut donc penser en termes de services rendus (càs l'ensemble de fonction public) et non en termes de données. On dit que "on encapsule des services, pas des données".+On comprend mieux un autre principe expliqué plus tôt, le principe d'encapsulation. Si on pense en termes de données encapsulées, on rencontre un problème de substituabilité. Il faut donc penser en termes de services rendus (cas l'ensemble de fonctions publiques) et non en termes de données. On dit que "on encapsule des services, pas des données".
  
 Nous allons voir que, contrairement aux variables membres, les fonctions membres peuvent avoir un comportement qui s'adapte au type réel des objets (type dynamique) et non au type statique (le type de la variable qui contient l'objet). Nous allons voir que, contrairement aux variables membres, les fonctions membres peuvent avoir un comportement qui s'adapte au type réel des objets (type dynamique) et non au type statique (le type de la variable qui contient l'objet).
Ligne 59: Ligne 59:
  
  
 +  * destructeur virtuel
 +  * MyClass::foo pour appeler explictement le parent
  
 +===== Redefinition et masquage =====
  
 +Masquage de nom (hide name) = fonction dans la classe derive a le meme nom que la classe parent, et empeche de voir la fonction de la classe parent.
  
 +<code cpp>
 +struct A {
 +    void f();
 +};
 +
 +struct B : A {
 +    void f();
 +};
 +</code>
 +
 +Probleme avec polymorphisme : risque d'erreur sur la fonction appellee.
 +
 +<code>
 +auto p = new B;
 +auto q = static_cast<A*>(p);
 +</code>
 +
 +Differents cas :
 +
 +<code cpp>
 +struct A {
 +    virtual void f();
 +};
 +
 +struct B : A {
 +    virtual void f(int);
 +};
 +</code>
 +
 ++ override + final + signature differente
  
-  * masquage de fonctions 
-  * destructeur virtuel 
-  * MyClass::foo pour appeler explictement le parent 
  
-^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ 
  
-{{tag> Cours C++}}+^ [[polymorphisme_et_pointeurs|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[invariant_de_classe|Chapitre suivant]] ^
fonction_virtuel.1418068331.txt.gz · Dernière modification: 2014/12/08 20:52 par gbdivers