2011-03-17 10 views
7
#include <iostream> 
#include <vector> 
using namespace std; 

class Base 
{ 
public: 
     void Display(void) 
     { 
      cout<<"Base display"<<endl; 
     } 

     int Display(int a) 
     { 
      cout<<"Base int display"<<endl; 
      return 0; 
     } 

}; 

class Derived : public Base 
{ 
public: 

     void Display(void) 
     { 
      cout<<"Derived display"<<endl; 
     } 
}; 


void main() 
{ 
    Derived obj; 
    obj.Display(); 
    obj.Display(10); 
} 

$test1.cpp: In function ‘int main()’: 
test1.cpp:35: error: no matching function for call to ‘Derived::Display(int)’ 
test1.cpp:24: note: candidates are: void Derived::Display() 

En comentando obj.Display(10), funciona.¿Qué pasa con el siguiente código? No es la compilación de

+0

¿Qué compilador está usando? Parece 'gcc' pero ¿es este el código más reciente? ¿Por qué obtienes '$ test1.cpp: en la función 'int main()':' aunque hayas definido main como 'void main()'? – Muggen

+0

intentado con gcc y vC++. Código copiado del editor de vC++, salida de gcc pegada. –

Respuesta

2

Es necesario colocar -

using Base::Display ; // in Derived class 

Si un nombre de método se adapta en la clase Derived, compilador no se verá en la clase Base. Por lo tanto, para evitar este comportamiento, coloque using Base::Display;. A continuación, el compilador se verá en la clase Base si hay algún método que en realidad puede tener como argumento para intDisplay.

class Derived : public Base 
{ 
    public: 
    using Base::Display ; 
    void Display(void) 
    { 
     cout<<"Derived display"<<endl; 
    } 
}; 
+1

¿es esto algo específico del compilador? –

+1

Funciona con el uso. ¿Podrías explicarme qué está sucediendo sin el uso? –

+0

No debe int Visualizar (int) se deriva de todos modos, ya que está declarado como público. –

3

Es necesario utilizar la declaración using. Una función miembro llamada f en una clase Xoculta todos los demás miembros llamados f en las clases base de X.

¿Por qué?

Leer this explanation por AndreyT

se puede llevar en esos nombres ocultos mediante el uso de una declaración using:

using Base::Display es lo que hay que incluir en la clase derivada.

Además void main() es no estándar. Utilice int main()

+2

Ha definido main como 'void main()' pero ¿cómo es que obtiene '$ test1.cpp: en la función 'int main()':'? – Muggen

+5

@Muggen: es ilegal declarar 'main' como un tipo de devolución de algo que no sea' int'.Esta implementación particular parece simplemente ignorar este error y tratar el código como si declarara 'main' correctamente. –

Cuestiones relacionadas