2010-07-08 11 views
12

En una clase derivada Si redefino/sobrecarga un nombre de función de una clase Base,
, esas funciones sobrecargadas no son accesibles/visibles para la clase derivada.
¿Por qué es esto?las funciones sobrecargadas están ocultas en la clase derivada

Si no sobrecargar la función oveloaded de la clase base en la clase derivada entonces todas las versiones sobrecargadas de esa función están disponibles para los derivados de clase
objetos, ¿por qué es esto ??
cuál es la razón detrás de esto. Si explica esto en el compilador y en el nivel de vinculador
, será más útil para mí. ¿No es posible apoyar este tipo de scinario?

Edited 
For examble: 

class B 
{ 

    public: 
    int f() {} 
    int f(string s) {} 
}; 

class D : public B 
{ 
    public: 
    int f(int) {} 
}; 

int main() 
{ 
    D d; 
    d.f(1); 
    //d.f(string); //hidden for D 
} 

Now object 'd' can't access f() and f(string).
+2

Podría publicar algún código de ejemplo, su descripción no está clara en absoluto. –

+1

posible duplicado de [¿Por qué una función anulada en la clase derivada oculta otras sobrecargas de la clase base?] (Http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the- derived-class-hide-other-overloads-of-the) – sbi

+0

@sbi Lamento publicar una pregunta duplicada. En realidad, intenté por un tiempo si había alguna pregunta similar pero no encontré ninguna. Mi patrón de búsqueda era incorrecto, eso no ha encontrado la pregunta existente. – esh

Respuesta

12

TTBOMK esto no tiene una razón técnica verdadera, es sólo que BS, al crear la lengua, considera que este es el mejor valor predeterminado. (. En este que es similar a la regla de que rvalues ​​no se unen de forma implícita a const referencias no)

se puede trabajar fácilmente alrededor de ella estar trayendo explícitamente versiones de la clase base en la clase derivada alcance:

class base { 
public: 
    void f(int); 
    void g(int); 
}; 

class derived : public base { 
public: 
    using base::f; 
    void f(float); 
    void g(float); // hides base::g 
}; 

o llamando al explícita:

derived d; 
d.base::g(42); // explicitly call base class version 
+3

Esta respuesta a otra pregunta relacionada proporciona la justificación: http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of- the/1629074 # 1629074 –

+1

Estoy muy feliz de ser miembro de este grupo. Los miembros aquí son increíbles. Estoy tan divertido de ver las respuestas en poco tiempo. – esh

+0

@jon: en realidad, esto hace que esta pregunta sea un duplicado. Yo voté para eliminar este. – sbi

6

las funciones están disponibles, sólo tiene que llamar explícitamente:

struct A { 
    void f(){} 
}; 

struct B : public A { 
    void f() {} 
}; 

int main() { 
    B b; 
    b.f();  // call derived function 
    b.A::f(); // call base function 
} 
Cuestiones relacionadas