2009-11-25 5 views
0

Pourquoi le compilateur ne trouve-t-il pas la signature de la fonction de classe de base? Modification foo(a1) à B::foo(a1) fonctionne.Problème de fonction surchargé C++

code:

class A1 ; 
class A2 ; 

class B 
{ 
public: 
    void foo(A1* a1) { a1 = 0 ; } 
} ; 

class C : public B 
{ 
public: 
    void foo(A2* /*a2*/) 
    { 
     A1* a1 = 0 ; 
     foo(a1) ; 
    } 
} ; 

int main() 
{ 
    A2* a2 = 0 ; 
    C c ; 
    c.foo(a2) ; 
    return 0 ; 
} 

erreur du compilateur (VS2008):

error C2664: 'C::foo' : cannot convert parameter 1 from 'A1 *' to 'A2 *' 
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
+0

-vous obtenir cette erreur sur la dernière ligne de 'C :: foo' ou 'main'? –

+0

L'erreur est à 'foo (a1)' dans 'C :: foo()'. – swongu

+0

Il est appelé "nom caché". Lisez la FAQ: http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9 – AnT

Répondre

5

Le nom C::foo cache le nom B::foo. Une fois que le compilateur a trouvé la correspondance foo dans la classe B, il arrête de chercher plus loin.

Vous pouvez résoudre votre problème en ajoutant:

using B::foo; 

au corps de la classe C, ou en renommant la fonction en classe B.

+1

En outre, le principal n'est pas autorisé à être vide. Il doit retourner un int, par le standard C++. – ChrisInEdmonton

+0

Vous pouvez également rendre la fonction virtuelle dans la classe B. – ChrisInEdmonton

+0

Ma question est maintenant conforme à la norme C++. – swongu

Questions connexes