2010-06-17 3 views
1

J'ai un problème avec mes méthodes virtuelles dans une classe dérivée. Voici mes classes C++ (simplifiées).Le compilateur ne trouve pas les méthodes de la classe de base

class Base 
    virtual method accept(MyVisitor1* v) { /*implementation is here*/ }; 
    virtual method accept(MyVisitor2* v) { /*implementation is here*/ }; 
    virtual method accept(MyVisitor3* v) { /*implementation is here*/ }; 

class DerivedClass 
    virtual method accept(MyVisitor2* v) { /*implementation is here*/ }; 

L'utilisation suivante provoque VS 2005 pour donner: "erreur C2664: 'ClasseDérivée :: accept': ne peut pas convertir le paramètre 1 de 'Visitor1 *' à 'Visitor2 *".

DerivedClass c; 
MyVisitor1 v1; 
c.accept(v1); 

j'attendais le compilateur de trouver et d'appeler Base :: accept (MyVisitor1) pour mes ClasseDérivée aussi bien. Évidemment, cela ne fonctionne pas, mais je ne comprends pas pourquoi. Des idées?

Merci,

Paul

+3

La classe Derived dérive-t-elle réellement de la classe Base? Est-ce l'héritage public? Les méthodes de la classe Base sont-elles également publiques? – Patrick

+0

Vous devriez probablement fournir du code qui compile réellement. Il semble que DerivedClass ne dérive pas réellement de Base, mais puisque le code fourni n'est pas C++, nous ne pouvons pas le savoir avec certitude. –

+0

S'il vous plaît poster le code réel. Etes-vous sûr que vous avez utilisé l'héritage public? –

Répondre

4

Le membre accept de DerivedClass cache des membres de la classe de base avec le même nom, même si elles ont des signatures différentes. Pour les inclure, ajouter ce qui suit à la définition de DerivedClass:

using Base::accept; 

(Je suppose que DerivedClass ne découle de Base, votre extrait ne dit pas explicitement que).

+0

Cela a fonctionné. Je ne savais pas à propos de cette utilisation du mot-clé en utilisant. Je vous remercie. – Paul

Questions connexes