2011-05-17 19 views
5

Duplicar posibles:
Function with same name but different signature in derived classEjemplo simple de herencia C++, ¿qué ocurre?

Estoy intentando compilar este y no puedo averiguar lo que está mal con el código. Estoy usando MacOSX Snow Leopard con Xcode g ++ versión 4.2.1. ¿Puede alguien decirme cuál es el problema? Creo que esto debería compilar. Y esta no es mi tarea, soy un desarrollador ... al menos, pensé que lo era hasta que me quedé perplejo. Me sale el siguiente mensaje de error:

error: no matching function for call to ‘Child::func(std::string&)’ 
note: candidates are: virtual void Child::func() 

Aquí está el código:

#include <string> 

using namespace std; 

class Parent 
{ 
public: 
    Parent(){} 
    virtual ~Parent(){} 
    void set(string s){this->str = s;} 
    virtual void func(){cout << "Parent::func(" << this->str << ")" << endl;} 
    virtual void func(string& s){this->str = s; this->func();} 
protected: 
    string str; 
}; 

class Child : public Parent 
{ 
public: 
    Child():Parent(){} 
    virtual ~Child(){} 
    virtual void func(){cout << "Child::func(" << this->str << ")" << endl;} 
}; 

class GrandChild : public Child 
{ 
public: 
    GrandChild():Child(){} 
    virtual ~GrandChild(){} 
    virtual void func(){cout << "GrandChild::func(" << this->str << ")" << endl;} 
}; 

int main(int argc, char* argv[]) 
{ 
    string a = "a"; 
    string b = "b"; 
    Child o; 
    o.set(a); 
    o.func(); 
    o.func(b); 
    return 0; 
} 
+0

Tan sólo una hora de vuelta otra persona tenía este problema: http: // stackoverflow. com/questions/6034869/c-inheritence – Nawaz

Respuesta

11

La presencia de Child::func() esconde todas las sobrecargas de Parent::func, incluyendo Parent::func(string&). Se necesita un "uso" Directiva:

class Child : public Parent 
{ 
public: 
    using Parent::func; 
    Child():Parent(){} 
    virtual ~Child(){} 
    virtual void func(){cout << "Child::func(" << this->str << ")" << endl;} 
}; 

EDIT: O bien, puede especificar el ámbito correcto sí mismo:

int main(int argc, char* argv[]) 
{ 
    string a = "a"; 
    string b = "b"; 
    Child o; 
    o.set(a); 
    o.func(); 
    o.Parent::func(b); 
    return 0; 
} 
+0

¡Gracias! ¡Exactamente lo que necesitaba! – bantl23