Outils pour utilisateurs

Outils du site


lang:cpp:heritage

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:cpp:heritage [2017/11/23 23:43] – Fusion lang:c:syntaxe:heritage rootlang:cpp:heritage [2020/03/10 23:07] (Version actuelle) – supprimée root
Ligne 1: Ligne 1:
-====Méthodes statiques dans une interface==== 
-Normalement, c'est interdit mais apparemment, c'est possible en faisant du bricolage. 
  
-[[http://www.cheshirekow.com/wordpress/?p=55|Source]], {{ lang:c:syntaxe:heritage:static_interfaces_in_c_brain_dump.htm.maff |Archive}} 
- 
-L'interface : 
-<code cpp> 
-template < typename T > 
-class StaticInterface 
-{ 
-  public: 
-    StaticInterface() 
-    { 
-      int(*fooCheck)(int)   = T::foo; 
-      bool(*barCheck)(bool) = T::bar; 
-    } 
-}; 
-</code> 
- 
-Une implémentation de la classe : 
-<code cpp> 
-class DerivedClass : public StaticInterface<DerivedClass> 
-{ 
-  public: 
-    static int foo(int  param){ return 10; } 
-    static bool bar(bool param){ return 20; } 
-}; 
-</code> 
- 
-====Cast vers un parent d'un héritage multiple==== 
-{{ :lang:c:syntaxe:heritage:heritage_multiple.svg?300 |}} 
- 
-Depuis ''Parent1'', caster ''this'' vers ''Parent2''. 
- 
-Il ne faut surtout pas faire (ci-dessous). Sinon, les méthodes virtuelles (au minimum) appelleront n'importe quoi. De toute façon d'une manière générale, ''reinterpret_cast'' ne s'utilise que vers la classe la plus basse dans l'héritage. 
-<code cpp> 
-Parent2* p = reinterpret_cast<Parent2*>(this); 
-</code> 
- 
-Il faut faire (ci-dessous). Puis un ''cast'' naturel se fera de ''Enfant'' vers ''Parent2''. 
-<code cpp> 
-Parent2* p = static_cast<Enfant*>(this); 
-</code> 
- 
-=====reinterpret_cast sur une classe avec héritage===== 
-Un ''static_cast'' ou un ''dynamic_cast'' ne pose pas de problème dans le cas d'héritage multiple. 
- 
-Par contre, un ''reinterpret_cast'' d'un ''void *'' doit toujours se faire sur la classe la plus basse (la plus enfant). Un ''void *'' ne possède aucune information du type de la classe et donc le compilateur ne sait pas comment s'en sortir. Par exemple avec les méthodes virtuelles, il ne peut pas savoir à quelle classe appartient la première méthode en tête de la ''vtable''. Il y a les mêmes problèmes avec les attributs de la classe. 
- 
-[[https://stackoverflow.com/questions/2379427/multiple-inheritance-unexpected-result-after-cast-from-void-to-2nd-base-class|Source]], {{ :lang:cpp:heritage:c_-_multiple_inheritance_unexpected_result_after_cast_from_void_to_2nd_base_class_-_stack_overflow.maff |Archive}} 
lang/cpp/heritage.1511477031.txt.gz · Dernière modification : 2017/11/23 23:43 de root