¿Cómo llamo a la función padre desde una clase derivada usando C ++? Por ejemplo, tengo una clase llamada parent
, y una clase llamada child
que se deriva de padre. Dentro de cada clase hay una print
función. En la definición de la función de impresión del niño, me gustaría llamar a la función de impresión de los padres. ¿Cómo haría para hacer esto?
c++
oop
inheritance
IaCoder
fuente
fuente
Respuestas:
Me arriesgaré a decir lo obvio: llama a la función, si está definida en la clase base, está automáticamente disponible en la clase derivada (a menos que sea
private
).Si hay una función con la misma firma en la clase derivada, puede desambiguarla agregando el nombre de la clase base seguido de dos puntos
base_class::foo(...)
. Debe tener en cuenta que, a diferencia de Java y C #, C ++ no tiene una palabra clave para "la clase base" (super
obase
) ya que C ++ admite la herencia múltiple, lo que puede generar ambigüedad.Por cierto, no puede derivar directamente de la misma clase dos veces, ya que no habrá forma de referirse a una de las clases base sobre la otra.
fuente
template<class A, class B> class C: public A, public B {};
dos tipos pueden ser iguales por razones que dependen de cómo se usa el código (lo que hace que A y B sean iguales), pueden ser dos o tres abstracción de alguien que no sabe lo que hiciste.using namespace std
.Dada la clase principal llamada
Parent
y la clase secundaria nombradaChild
, puede hacer algo como esto:Tenga en cuenta que
Parent
es el nombre real de la clase y no una palabra clave.fuente
foo()
aquíprint()
una función análoga o separada? Y qué se refiere con el uso deprivate
la herencia para ocultar detalles heredado de la base, y proporcionarpublic
sombra funciones para las cosas que no desea exponer?foo()
fue análogo aprint()
. Permítanme volver a usarlo,print()
ya que creo que tendría más sentido en este contexto. Digamos que alguien creó una clase que realizó un conjunto de operaciones en un tipo de datos en particular, expuso algunos accesores y tuvo unprint(obj&)
método. Necesito una nueva clase que funcione,array-of-obj
pero todo lo demás es igual. La composición da como resultado una gran cantidad de código duplicado. Minimiza la herencia que, enprint(array-of-obj&)
la llamada bucleprint(obj&)
, pero no desea que los clientes llamanprint(obj&)
, porque no tiene sentido para los que lo haganSi se llama a su clase base y se llama a
Base
su funciónFooBar()
, puede llamarla directamente usandoBase::FooBar()
fuente
En MSVC hay una palabra clave específica de Microsoft para eso: __super
MSDN: le permite declarar explícitamente que está llamando a una implementación de clase base para una función que está anulando.
fuente
typdef
el padre sea algo asísuper
.__super
; Lo mencioné aquí como una sugerencia alternativa. Los desarrolladores deben conocer su compilador y comprender los pros y los contras de sus capacidades.Si el modificador de acceso de la función miembro de la clase base está protegido O público, puede llamar a la función miembro de la clase base desde la clase derivada. Se puede realizar una llamada a la función miembro no virtual y virtual de la clase base desde la función miembro derivada. Por favor, consulte el programa.
Salida:
fuente
virtual
!Llame al método principal con el operador de resolución de alcance principal.
fuente
Ejemplo de referencia
fuente