elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Duda sobre la sobreescritura de una función miembro en una clase derivada?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Duda sobre la sobreescritura de una función miembro en una clase derivada?  (Leído 4,319 veces)
theluigy13etv

Desconectado Desconectado

Mensajes: 179


Primero se hace, después se mejora


Ver Perfil
¿Duda sobre la sobreescritura de una función miembro en una clase derivada?
« en: 21 Julio 2013, 07:44 am »

Hola a todos, necesito una pequeña ayuda, resulta que conozco un poco de Java así que me animé a aprender C++ y ahora estoy practicando lo que es la herencia y el polimorfismo. Estoy que me tranqueo en la parte de la sobreescritura de métodos.

Verán, primero definí una clase base llamada Persona con dos atributos: "nombre" y "edad", además con 5 métodos públicos: "setNombre", "setEdad", "getNombre", "getEdad" y "metodo".

Luego definí dos clases derivadas de la clase Persona. Las clases derivadas son Alumno y Docente. Ambas clases con sus propios métodos set y get para manipular sus propios atributos (datos miembro) . Luego, en las clases derivadas Alumno y Docente redefiní la función miembro llamada "metodo" que heredaron de la clase base Persona.

Al final, en el método main, creé los objetos correspondientes a cada clase y luego hice que un puntero p de tipo de la clase base Persona ( Persona *p ) apunte a cada objeto creado para llamar a la función miembro "metodo" . Pensé que en cada caso se ejecutaría la función miembro correcta correspondiente a cada objeto pero al ver los resultados en pantalla me doy con la sorpresa de que en todos los casos se ejecuta la función miembro correspondiente a la clase base Persona. Tal vez estoy cometiendo un error y no sé como solucionarlo, espero que alguien me pueda ayudar, muchas gracias  :)

Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. // Clase PERSONA
  7. class Persona {
  8.  
  9. public:
  10.   // Constructor con argumentos por defecto
  11.   Persona(string nombre = "", const int edad = 0);
  12.  
  13.   // Métodos
  14.   void setNombre(string nombre);
  15.   void setEdad(const int edad);
  16.   string getNombre();
  17.   int getEdad();
  18.  
  19.   void metodo();;
  20.  
  21. private:
  22.   string nombre;
  23.   int edad;  
  24. };
  25.  
  26. Persona::Persona(string nombre, const int edad) : nombre(nombre), edad(edad < 0 ? 0 : edad) {
  27.   /*
  28.    this->setNombre(nombre);
  29.    this->setEdad(edad);
  30.    */
  31. }
  32.  
  33. void Persona::setNombre(string nombre) {
  34.   this->nombre = nombre;  
  35. }
  36.  
  37. void Persona::setEdad(const int edad) {
  38.   this->edad = (edad < 0) ? 0 : edad;  
  39. }
  40.  
  41. string Persona::getNombre() {
  42.   return this->nombre;  
  43. }
  44.  
  45. int Persona::getEdad() {
  46.   return this->edad;  
  47. }
  48.  
  49. void Persona::metodo() {
  50.   cout << "Metodo de la clase base Persona" << endl;
  51. }
  52.  
  53.  
  54. // CLASE ALUMNO
  55. class Alumno : public Persona {
  56.  
  57. public:
  58.   // Constructor con argumentos por defecto
  59.   Alumno(string nombre = "", int edad = 0, string codigo = "");
  60.  
  61.   void setCodigo(string codigo);
  62.   string getCodigo();
  63.  
  64.   void metodo();
  65.  
  66. private:
  67.   string codigo;
  68. };
  69.  
  70. Alumno::Alumno(string nombre, int edad, string codigo)
  71.   : Persona(nombre, edad), codigo(codigo) {
  72. }
  73.  
  74. void Alumno::setCodigo(string codigo) {
  75.   this->codigo = codigo;  
  76. }
  77.  
  78. string Alumno::getCodigo() {
  79.   return codigo;  
  80. }
  81.  
  82. void Alumno::metodo() {
  83.   cout << "Método redefinido de la clase derivada Alumno" << endl;  
  84. }
  85.  
  86. // CLASE DOCENTE
  87. class Docente : public Persona {
  88.  
  89. public:
  90.   // Constructor con tres argumentos por defecto
  91.   Docente(string nombre = "", int edad = 0, float salario = 0.0);
  92.  
  93.   void setSalario(float salario);
  94.   float getSalario();
  95.  
  96.   void metodo();
  97.  
  98. private:
  99.   float salario;
  100. };
  101.  
  102. Docente::Docente(string nombre, int edad, float salario)
  103.   : Persona(nombre, edad), salario(salario < 0.0 ? 0.0 : salario) {
  104. }
  105.  
  106. void Docente::setSalario(float salario) {
  107.   this->salario = (salario < 0.0) ? 0.0 : salario;  
  108. }
  109.  
  110. float Docente::getSalario() {
  111.   return salario;  
  112. }
  113.  
  114. void Docente::metodo() {
  115.   cout << "Método redefinido de la clase base Docente" << endl;  
  116. }
  117.  
  118. int main()
  119. {  
  120.   Persona *p;
  121.   cout << "PERSONAS:" << endl;
  122.   p = new Persona("Dennis Ritchie", 19);      
  123.   p->metodo();
  124.  
  125.   cout << "\nALUMNOS:" << endl;
  126.   p = new Alumno("Bjarne Stroustrup", 22, "20080541x");
  127.   p->metodo();
  128.  
  129.   p = new Alumno("Esther Noemí", 19, "21130515h");
  130.   p->metodo();
  131.  
  132.   cout << "\nDOCENTES:" << endl;
  133.   p = new Docente("Riquelmer Vazques", 58, 1500.0);
  134.   p->metodo();
  135.  
  136.   cin.get();
  137.   return 0;  
  138. }
  139.  


« Última modificación: 21 Julio 2013, 07:49 am por theluigy13etv » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: ¿Duda sobre la sobreescritura de una función miembro en una clase derivada?
« Respuesta #1 en: 21 Julio 2013, 11:08 am »

Creo que te has equivocado y has puesto la etiqueta de java (o otro lenguaje, el caso esque ese resaltado sintáctico no me suena).

Si quieres que tu función se sobreescriba en la herencia, debes hacerla "virtual" en la clase base:

Código
  1. virtual void metodo();

Ahora sí debería funcionar  ;)


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
theluigy13etv

Desconectado Desconectado

Mensajes: 179


Primero se hace, después se mejora


Ver Perfil
Re: ¿Duda sobre la sobreescritura de una función miembro en una clase derivada?
« Respuesta #2 en: 21 Julio 2013, 19:18 pm »

Muchas gracias amchacon, ya solucioné el problema, tal y como dijiste, tuve que declarar la función de la clase base como virtual para que luego de que lo sobrescriba en las clases bases e invoque a esa función usando un puntero de la clase base, se ejecute la función correspondiente a la clase derivada.  :)  :)
En línea

theluigy13etv

Desconectado Desconectado

Mensajes: 179


Primero se hace, después se mejora


Ver Perfil
Re: ¿Duda sobre la sobreescritura de una función miembro en una clase derivada?
« Respuesta #3 en: 21 Julio 2013, 19:19 pm »

Muchas gracias amchacon, ya solucioné el problema, tal y como dijiste, tuve que declarar la función de la clase base como virtual para que luego de que lo sobrescriba en las clases derivadas e invoque a esa función usando un puntero de la clase base, se ejecute la función correspondiente a la clase derivada.  :)  :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda sobre funcion rand()
Programación C/C++
Oblivi0n 4 3,271 Último mensaje 17 Junio 2010, 00:09 am
por cbug
PROBLEMA con la funcion miembro getline() e ignore()
Programación C/C++
.:BlackCoder:. 9 7,781 Último mensaje 27 Julio 2010, 04:29 am
por leogtz
Clase Derivada; Listas de Inicializacion.
Programación C/C++
necro1991 2 4,595 Último mensaje 11 Octubre 2010, 05:45 am
por necro1991
FILE * como dato miembro de una clase (C++)
Programación C/C++
oPen syLar 2 3,613 Último mensaje 18 Octubre 2011, 17:48 pm
por oPen syLar
duda sobre funcion booleana c++
Programación C/C++
indict 5 6,198 Último mensaje 12 Diciembre 2012, 02:48 am
por naderST
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines