PDF de programación - Programación C++ (5º Parte)

Imágen de pdf Programación C++ (5º Parte)

Programación C++ (5º Parte)gráfica de visualizaciones

Publicado el 22 de Enero del 2021
225 visualizaciones desde el 22 de Enero del 2021
370,9 KB
16 paginas
Creado hace 11a (17/03/2013)
Programación C++ (5°Parte)

Dr. Oldemar Rodríguez Rojas
Escuela de Informática
Universidad Nacional

Polimorfismo, métodos

virtuales y estáticos

Todos los métodos vistos hasta ahora son
estáticos, estos se caracterizan porque las
llamadas
están
determinadas en tiempo de compilación
(vinculación anticipada).

métodos

a

estos

Los métodos virtuales actúan diferente, pues
cuando se llama a un método virtual
los
llamados se vinculan en tiempo de ejecución
(vinculación tardía o dinámica).

Ejemplo:

Supongase que se desea agregar el siguiente
método a la clase Persona:

void Persona::FelizCumpleanos() {

Edad++;

cout << "El registro ha sido actualizado" << endl;

cout << toString() << endl;

}

Este método actualiza la edad de una persona y luego
llama al método Muestra para presentar en pantalla la
actualización.

La clase Asistente hereda este nuevo método puesto que
es una clase derivada. A continuación se presenta un
programa que utiliza este método para una instancia de la
clase de "tipo'' Asistente:

A1.Captura();
cout << A1.toString() << endl;
system("pause");
cout << endl;

A1.FelizCumpleanos();
system("pause");
cout << endl;

Nótese que esta salida es incorrecta, pues
cuando se llama al método Muestra a través del
método FelizCumpleanos se invoca al método
Muestra de la clase Persona, cuando se debería
llamar al método Muestra de la clase Asistente.

En el siguiente gráfico se ilustra
lo sucedido:

Asistente.FelizCumpleanosPersona.FelizCumpleanosPersona.MuestraAsistente.Muestra Solución:

Una posible solución a esta deficiencia es redefinir
el método FelizCumpleanos en la clase Asistente,
pero esto va contra la filosofía de la Programación
Orientada a Objetos (POO) que trata de reducir el
código redundante.
La solución de la POO es el uso de métodos
virtuales.
C++ requiere de dos pasos para convertir un
método en virtual:
1. Crear un constructor de la clase (si este no ha

sido creado).

2. Agregar la palabra reservada virtual en la parte

de definición de la clase.

Se ilustra en el siguiente ejemplo:

class Persona {
protected:

string Nombre;
int Edad;

public:

Persona(string Nom, int Ed);
Persona();
void Captura();
virtual string toString();
void SetNombre(string NuevoNom);
void SetEdad(int NuevaEdad);
string GetNombre();
int
void FelizCumpleanos();

GetEdad();

};
...............................

class Asistente : public Persona {

float PromPonderado;
int HorasAs;
string Curso;
string Carrera;

public:

Nom,int

Ed,float
Asistente(string
Prom,string Cur,int HA,string Carr);
Asistente();
void Captura();
virtual string toString();
float GetPromPoderado();
void
NuevoProm);
int
void SetHorasAs(int NuevaHo);
string GetCurso();
string GetCarrera();
void SetCurso(string NuevoCurso);
void SetCarrera(string NuevaCarrera);

SetPromPonderado(float

GetHorasAs();

};

Una vez hecha esta
corrección la salida
del programa es
correcta:

Asistente.FelizCumpleanosPersona.FelizCumpleanosPersona.MuestraAsistente.Muestra Compatibilidad entre objetos

a

Las variables "tipo" clase siguen reglas de
compatibilidad un poco diferentes
las
variables normales de C. La diferencia básica
es que una variable de un tipo es compatible
con cualquier otra
variable de un tipo
descendiente en la jerarquía, pero no a la
inversa.
Por ejemplo, el siguiente programa es correcto,
con las definiciones previas de Persona y
Asistente.

Ejemplo:

void main() {

Persona P1("Carlos",20);
Asistente A1("Andrea",19,90,"Programación
I",10,"Computación");
P1=A1;
P1.Muestra();

}

Es correcto, pues a P1 se le asignan todos los
campos comunes con A1 y los demás campos
se desestiman. Pero el siguiente programa
produce error de compilación:

Ejemplo:
void main() {

Persona P1("Carlos",20);
Asistente
I",10,"Computación");
A1=P1;
A1.Muestra();

}

A1("Adrea",19,90,"Programación

Pues el compilador no sabe qué hacer con los
campos o atributos adicionales de la clase
Asistente respecto de la clase Persona.
Esta asignación podría ser válida si se
sobrecarga el operador = de la clase Persona.

El polimorfismo y la
extensibilidad

La flexibilidad de la compatibilidad de tipos permite
un concepto potente en POO, el polimorfismo, es
decir que un procedimiento o función está dispuesto
a aceptar un amplio rango de tipos como parámetro,
los cuales incluso se pueden determinar en tiempo
de ejecución.
Además
esto permite agregar otro concepto
importante en POO, la extensibilidad, la cual permite
a los programadores trabajar con módulos ya
compilados y agregar sus propias clases derivadas,
tal como sucede en VCL.

Punteros a Objetos:

C++ soporta la creación de punteros a clases, por
ejemplo el siguiente programa usa una variable
tipo puntero a una Persona:

void main() {

Persona *PP1;
PP1=new Persona("Rolando",10);
cout << PP1->toString() << endl;
PP1->SetEdad(22);
cout << PP1->toString() << endl;
delete(PP1);

}

En el siguiente ejemplo con la ayuda de los
punteros a clases y de los métodos virtuales se
implementará una lista enlazada polimórfica de
nodos "tipo" Persona, Asistente, Estudiante y
EstCompu definidos en el ejemplo anterior.
Gráficamente esta lista se puede representar
como sigue:

Primera......AsistentePersonaEstudiante Ver Ejemplo <EjemploP3-4>
Una posible salida de este programa es la lista
polimórfica que se muestra a continuación:
  • Links de descarga
http://lwp-l.com/pdf18739

Comentarios de: Programación C++ (5º Parte) (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad