2010-08-12 5 views
1

i ont quelque chose comme çaMéthode héritée avec différents types

class A { 
    virtual void doBla(A *a) = 0; 
}; 

class B : public A { 
    virtual void doBla(B *b) { // do stuff ;}; 
}; 

et je veux faire quelque chose comme

A* a = new B(); 
B* b = new B(); 
a->doBla(b); 

ou: tous les enfants de A sont censés avoir une méthode Dobla qui prend paramètre du type de l'enfant. Espérons que vous obtenez mon problème et nous espérons que quelqu'un peut me aider ou me convaincre que c'est mauvais style :)

modifier: ajoutée virtuelle aux méthodes

+0

Vous devez faire doBla virtuel en A. –

+0

@Neil: Je ne crois pas que cela aidera dans ce cas. Je pense que le PO a besoin de types de paramètres covariants, qui ne sont apparemment pas supportés en C++ (voir http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#C.2B.2B). – David

+0

@Neil: désolé, oubliez que ... thx – Dirk

Répondre

1

Vous ne pouvez pas surcharger les fonctions à travers les classes de base/enfants et doBla fonction membre de la classe A doit être publique si vous voulez l'appeler de l'extérieur:

class A { 
    public: 
    virtual void doBla(A *a) = 0; 
}; 

class B : public A { 
    virtual void doBla(A *a) { /*do stuff*/ } 
}; 

Edit: Notez que la déclaration de la fonction doBla est similaire dans les classes A et B.

+0

n'est-ce pas automatiquement public? – Dirk

+0

@Dirk: les fonctions membres de la classe sont privées (par défaut) et les fonctions membres de struct sont publiques (par défaut). –

1

C'est impossible en l'état - a n'a pas de fonction doBla (B * b), donc quand vous essayez de l'appeler sur l'instance, le compilateur ne peut pas garantir d'aucune façon que cette fonction existe réellement, et il ne sait pas comment le chercher. C'est une erreur ou dix.

Ce que vous cherchez peut-être est double expédition.

class A { 
public: 
    virtual void doBla(A* a) { a->doBla_impl(this); } 
private: 
    virtual void doBla_impl(A* a); 
    virtual void doBla_impl(B* b); 
    // etc 
}; 

class B : public A { 
public: 
    virtual void doBla(A* a) { a->doBla_impl(this); } 
private: 
    virtual void doBla_impl(A* a); 
    virtual void doBla_impl(B* b); 
    // etc 
}; 

Le problème avec ceci est que vous devez connaître tous les types dérivés de la classe de base, ce qui est pas toujours possible ou réalisable.

Questions connexes