2009-10-11 7 views
0

J'ai une hiérarchie de classe suivante:Comment comparer deux pointeurs à un objet par leur type le plus dérivé?

class Base{ 
.... 
virtual bool equal(Base *); 
} 

class Derived1: public Base{ 
.... 
virtual bool equal(Base *); 
} 
class Derived2: public Derived1{ 
} 
class Derived3: public Derived1{ 
} 
class Derived4: public Base{ 
} 

Comment je devrais écrire Base :: égale (Base *) fonction telle que compare Derived4 et similaire classé? Ils n'ont pas de champs de données, donc vérifiez seulement que les objets réels sont de la même classe dérivée. Et comment écrire Derived1 :: equal (Base) - les Derived2 et Derived3 sont similaires, ils n'ont pas de champ de données et doivent être comparés par des champs de données dans Derived1 et vérifient que les objets sont issus des mêmes classe?

Mise à jour: Je veux parce que je ne veux pas écrire des fonctions identiques à chaque classe dérivée tels que:

bool Derived::equal(Base *b){ 
    Derived *d = dynamic_cast<Derived*>(b); 
    return d; 
} 
+4

Eh bien, par conception, les objets dérivés ne devraient pas avoir une bonne connaissance l'un de l'autre. Pourquoi veux-tu faire cela? – GManNickG

+2

@GMan Accepté. C'est une odeur de code. Vous voulez probablement juste mieux concevoir votre hiérarchie de classe et faire confiance au polymorphisme. – xanadont

+0

maudit ma capacité de frappe. à * – GManNickG

Répondre

2

Je pense que vous pouvez utiliser typeid opérateur ici. Vous pouvez faire quelque chose comme:

typeid(*pointerBase) == typeid(*this); 

Mais pourquoi voulez-vous faire quelque chose comme ça? Il semble très suspect, je suggère de prendre un relook à la conception.

+1

nom return char *. La comparaison du pointeur n'est pas correcte. utilisez typeid (* this) == typeid (* pointerBase) directement –

3

La technique générique pouvant être utilisée pour les comparaisons inter-types polymorphes est appelée "double dipatch" (voir Double Dispatch). Il peut être appliqué à votre problème spécifique, auquel cas vous allez vous retrouver avec un tas de fonctions surchargées avec des corps presque vides, renvoyant juste 'faux' ou 'vrai'.

Bien sûr, si vous voulez simplement comparer des types dynamiques et rien d'autre, vous pouvez simplement le faire via des informations de type à l'exécution (par exemple, utilisez 'typeid').

+0

Sidenote: Il y a aussi Multiple Dispatch (http://en.wikipedia.org/wiki/Multiple%5Fdispatch) pour implémenter Multi Methods. – sbi

Questions connexes