Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] ¿Por qué se hacen llamadas a los métodos de las clases bases?

Estas en el tema de ¿Por qué se hacen llamadas a los métodos de las clases bases? en el foro de C/C++ en Foros del Web. Bueno, pues aquí con otra de las mías. Y esa es mi duda. Cuando reimplemento una función en una clase derivada, siempre veo (en libros ...
  #1 (permalink)  
Antiguo 02/12/2015, 06:32
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
¿Por qué se hacen llamadas a los métodos de las clases bases?

Bueno, pues aquí con otra de las mías.

Y esa es mi duda. Cuando reimplemento una función en una clase derivada, siempre veo (en libros y manuales) que se hace una llamada a la función de la clase base.

No entiendo el por qué de esta llamada, y menos aún si la función de la clase base es virtual.

(Espero no haber dicho muchas tonterías)

Saludos y gracias, como siempre
__________________
Mi calculadora en Qt
  #2 (permalink)  
Antiguo 02/12/2015, 07:07
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: ¿Por qué se hacen llamadas a los métodos de las clases bases?

¿Puedes poner un ejemplo?, ahora mismo no pillo lo que quieres decir, jeje.
  #3 (permalink)  
Antiguo 02/12/2015, 07:15
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: ¿Por qué se hacen llamadas a los métodos de las clases bases?

Hola xKuZz, gracias por responder.

Pues ahora por ejemplo lo estoy viendo al reimplementar los eventos del ratón en Qt.

Por ejemplo (copiado de un aqui):

Código C++:
Ver original
  1. void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event){
  2.     if(sceneMode == DrawLine)
  3.         origPoint = event->scenePos();
  4.     QGraphicsScene::mousePressEvent(event);
  5. }
Saludos
__________________
Mi calculadora en Qt
  #4 (permalink)  
Antiguo 02/12/2015, 07:46
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: ¿Por qué se hacen llamadas a los métodos de las clases bases?

Cuando tu haces herencia public los métodos y datos public y protected se "copian" en la clase derivada, pero la clase derivada también tiene acceso a la clase base.

Cuando tu redefines el método redefines dicha "copia" por lo que la copia es cambiada pero el método base sigue siendo igual. Te dejo aquí un ejemplo para que lo comprendas:

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Base {
  5.    public:
  6.     virtual void f() {
  7.         cout << "soy la base";
  8.     }
  9.     virtual void g(){
  10.         cout << "Blablablabla no me vas a usar";
  11.     }
  12.  
  13.     virtual void h() {
  14.         cout << "Accedo al h de la base.\n";
  15.     }
  16. };
  17.  
  18. class Derivada: public Base{
  19. public:
  20.  
  21.     void f(){
  22.         cout << "Yo no ";
  23.         Base::f();
  24.         cout << ", pero puedo llamar a métodos de la clase de la que heredo" << endl;
  25.     }
  26.     void g(){
  27.         cout << "Pero tambien puedo redefinir metodos que no necesitan de la base"<< endl;
  28.     }
  29.     void h(){
  30.         cout << "Accedo al h de la derivada." << endl;
  31.     }
  32. };
  33.  
  34.  
  35. int main(){
  36.     Derivada A;
  37.     A.f();
  38.     A.g();
  39.     A.h();
  40.     A.Base::h();
  41. }
  #5 (permalink)  
Antiguo 02/12/2015, 08:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Por qué se hacen llamadas a los métodos de las clases bases?

Cuando se sobreescribe un método en una clase derivada muchas veces lo que se pretende no es cambiar radicalmente el funcionamiento de dicho método, sino simplemente hacer "algo adicional", como por ejemplo actualizar variables propias de la clase derivada. En este caso puedes o bien copiar y pegar el código de la función (no recomendado) o hacer una llamada al método de la clase padre para reutilizar su código.

¿Por qué funciona? porque, como te ha dicho xKuZz, el método sigue existiendo. Lo que sucede es que su código ha quedado "oculto" por tu versión de la función... pero eso no impide que desde tu clase puedas ejecutar ese código.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #6 (permalink)  
Antiguo 03/12/2015, 08:54
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: ¿Por qué se hacen llamadas a los métodos de las clases bases?

Hola xKuZz y eferion:

Gracias por responder.

Bueno, a ver si me ha quedado claro. Eso quiere decir que una función como la que he puesto está diciendo:
"Haz un uso de mousePressEvent según la versión de la clase derivada y cuando acabes vuelve a la versión de la clase base"?. Es decir, ¿es el propio método de la clase derivada el que se encarga de llamar al método de la case base cuando ya ha hecho lo que tuviera que hacer?
__________________
Mi calculadora en Qt
  #7 (permalink)  
Antiguo 03/12/2015, 10:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: ¿Por qué se hacen llamadas a los métodos de las clases bases?

Cita:
Iniciado por dehm Ver Mensaje
Es decir, ¿es el propio método de la clase derivada el que se encarga de llamar al método de la case base cuando ya ha hecho lo que tuviera que hacer?
Esa llamada la puedes hacer al principio, al final o entre medias... todo depende del orden en el que se deban ejecutar las instrucciones.

¿Cuando es necesario que se ejecute al principio? Cuando necesitas de algún valor que se calcule con la llamada al método del padre. Por ejemplo, imagínate una clase para llevar un préstamo... hay ciertos cálculos comunes que recaen en la clase base... si necesitas uno de esos valores (por ejemplo el tipo de interés a aplicar) para hacer tus cálculos entonces es necesario llamar a la clase base antes de ejecutar tu código.

¿Cuando es necesario que se ejecute después? Cuando resulta que las operaciones de la clase padre te pueden pisar valores que necesitas en tu función. Imagínate que creas un cuadro de texto avanzado y heredas de uno más básico, es posible que en la sobrecarga del método OnKeyPress necesites hacer operaciones antes de pasarle la pelota a la clase base. Si no puede pasar que la clase padre actualice el texto y entonces tus operaciones son más complicadas o directamente imposibles.

¿Cuando es necesario que se ejecute en el medio? Cuando se den de forma simultánea las dos condiciones anteriores XD

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #8 (permalink)  
Antiguo 04/12/2015, 08:38
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: ¿Por qué se hacen llamadas a los métodos de las clases bases?

Gracias. Ya me ha quedado claro.
Anda que no me queda nada
__________________
Mi calculadora en Qt

Etiquetas: clases, llamadas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:28.