2010-03-13 27 views
7

cuando se accede a foo() de "base" usando el objeto de clase derivada.acceso de la clase base con objeto de clase derivada que tiene un método de mismo nombre

#include <iostream> 

class base 
{ 
     public: 
     void foo() 
    { 
     std::cout<<"\nHello from foo\n"; 
    } 
}; 

class derived : public base 
{ 
    public: 
    void foo(int k) 
    { 
     std::cout<<"\nHello from foo with value = "<<k<<"\n"; 
    } 
}; 
int main() 
{ 
     derived d; 
     d.foo();//error:no matching for derived::foo() 
     d.foo(10); 

} 

cómo acceder al método de clase base que tiene un método del mismo nombre en la clase derivada. se ha mostrado el error generado. me disculpo si no estoy seguro pero siento que me he dejado claro como el agua. gracias de antemano.

Respuesta

10

Se podría añadir using base::foo a su clase derivada:

class derived : public base 
{ 
public: 
    using base::foo; 
    void foo(int k) 
    { 
     std::cout<<"\nHello from foo with value = "<<k<<"\n"; 
    } 
}; 

Editar: La respuesta para this question explica por qué su base::foo() no es directamente utilizable a partir de derived sin la declaración using.

+0

pero por qué no se puede acceder a la clase base foo() en clase derivada mientras he heredado esa clase base ... –

+2

@ashish: Es accesible (lo que significa especificadores de acceso de público/protegido/privado), pero es * oculto*. Lea la pregunta Josh vinculado: http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-the –

+0

oh ¡menos mal, yo estaba a punto de crear contenedores para delegar a las sobrecargas de base que se convirtió ocultos sólo para exponerlos del objeto derivado, algo así como 'void foo() {:: base de foo()}', y luego pensé que debe haber una manera mejor para hacer esto, y afortunadamente, sí, hay. También existe la opción de hacer 'd.base :: foo()', pero desde una perspectiva del lado del cliente que parece un poco molesto. – solstice333

2

Agregar siguiente instrucción para la clase derivada:

using Base::foo ; 

Esto debe servir al propósito.

Cuando se tiene una función en la clase derivada que tiene el mismo nombre que una de las funciones de la clase base, todas las funciones de la clase base se oculta y hay que llevar de forma explícita en el ámbito de su clase derivada como se ha mencionado.

0

podemos llamar método de la clase base con objeto de clase derivada. según el código a continuación.

#include<iostream.h> 
class base 
{ 
public: 
void fun() 
{ 
    cout<<"base class\n"; 
} 
}; 
class der : public base 
{ 
public: 
void fun() 
{ 
cout<<"derived class\n"; 
} 
}; 
int main() 
{ 

der d1; 


d1.base::fun(); 


return 0; 
} 

de salida será de la clase base.

Cuestiones relacionadas