Ceci est une ancienne révision du document !
Table des matières
Méthodes statiques dans une interface
Normalement, c'est interdit mais apparemment, c'est possible en faisant du bricolage.
L'interface :
template < typename T > class StaticInterface { public: StaticInterface() { int(*fooCheck)(int) = T::foo; bool(*barCheck)(bool) = T::bar; } };
Une implémentation de la classe :
class DerivedClass : public StaticInterface<DerivedClass> { public: static int foo(int param){ return 10; } static bool bar(bool param){ return 20; } };
Cast vers un parent d'un héritage multiple
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.
Parent2* p = reinterpret_cast<Parent2*>(this);
Il faut faire (ci-dessous). Puis un cast
naturel se fera de Enfant
vers Parent2
.
Parent2* p = static_cast<Enfant*>(this);
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.