Está en la página 1de 8

Programación II.

Guía 6 1

Facultad: Ingeniería
Escuela: Computación
Asignatura: Programación II

Tema: Funciones virtuales y polimorfismo

Objetivo
Específico
• Conocer que es ligadura y sus tipos
• Entender el concepto de polimorfismo
• Utilizar las funciones virtuales para aplicar el polimorfismo
• Definir funciones virtuales.

Materiales y Equipo

• Computadora DevC++
• Guía Número 6

Introducción
Ligadura

Representa una conexión entre una entidad y sus propiedades. Si la propiedad se limita a
funciones, ligadura es la conexión entre la llamada a función y el código que se ejecuta tras la
llamada. Desde el punto de vista de atributos, la ligadura es el proceso de asociar un atributo a
un nombre.

Clasificación de la ligadura

Ligadura Estática: Se produce antes de la ejecución (durante la compilación).

Ligadura Dinámica: La ligadura dinámica ocurre en la ejecución.

Funciones Virtuales

Una función virtual es una función miembro pública o protegida de una clase base que puede
ser redefinida en cada una de las clases derivadas de esta, y una vez redefinida puede ser
accedida mediante un puntero o referencia a la clase base. Esta se declara colocando la
palabra clave virtual antes de la declaración de la función miembro perteneciente a la clase
base.

Polimorfismo
2 Programación II, Guía 6
La utilización de clase derivadas y funciones virtuales es frecuentemente denominada
programación orientada a objetos. Además, la facultad de llamar a una variedad de funciones
utilizando exactamente el mismo medio de acceso, proporcionada por funciones virtuales, es a
veces denominada polimorfismo. Polimorfismo significa “la facultad de asumir muchas formas”,
refiriéndose a la facultad de llamar a muchas funciones diferentes con una sola sentencia.

Reglas para utilizar Polimorfismo:

1. Crear una jerarquía de clases con las operaciones importantes definidas por las funciones
miembros declaradas como virtuales en la clase base.

2. Las implementaciones específicas de las funciones virtuales se deben hacer en las clases
derivadas. Cada clase derivada puede tener su propia versión de las funciones. Ejemplo, la
implementación de la función dibujar varia de una función a otra.

3. Las instancias de las clases se manipulan a través de referencias o un puntero. Este


mecanismo es la ligadura dinámica y es la esencia del uso polimórfico en C++.

Resumen
En la siguiente práctica se pretende conocer los conceptos de ligadura, funciones
virtuales y polimorfismo para aplicarlo a los conceptos de Programación Orientada a
Objetos.

Procedimiento

EJEMPLO No. 1 - Funciones Virtuales


El siguiente ejemplo utiliza una clase llamada Figuras como Clase base y se implementas
dos nuevos objetos derivados del clase antes mencionada que son Rectángulo y
Triangulo.

#include <iostream>
#include <string.h>
#include <process.h>
using namespace std;
class Figuras{
public:
// Definiendo las funciones virtuales en la clase base
virtual void Calcular_Area();
Programación II. Guía 6 3

virtual void Dibujar_Figura();


virtual void Identificar();
protected:
char identificar[25];
float area;
};
// Cuando se definen las funciones no es necesario utilizar virtual
void Figuras::Calcular_Area(){
}
void Figuras::Dibujar_Figura(){
cout << "No hay dibujo disponible..." << endl;
}
void Figuras::Identificar(){
cout << "Nombre Figura:" << identificar << endl;
cout << "El Area es:" << area << endl;
}
class Rectangulo :public Figuras{
public:
Rectangulo(float b,float a);
void Calcular_Area();
void Dibujar_Figura();
void Identificar();
protected:
float base;
float altura;
};
Rectangulo::Rectangulo(float b, float a){
base=b;
altura=a;
strcpy(identificar,"Rectangulo");
}
void Rectangulo::Calcular_Area(){
area = (base*altura);
}
4 Programación II, Guía 6
void Rectangulo::Dibujar_Figura(){
cout << "********** " << endl;
cout << "* * " << endl;
cout << "* * altura" << endl;
cout << "* * " << endl;
cout << "********** " << endl;
cout << " Base " << endl;
}
void Rectangulo::Identificar(){
cout << "Base :" << base << endl;
cout << "Altura:" << altura << endl;
Figuras::Identificar();
}
class Triangulo : public Figuras{
public:
Triangulo(float b,float a);
void Calcular_Area();
void Dibujar_Figura();
void Identificar();
protected:
float base;
float altura;
};
Triangulo::Triangulo(float b, float a){
base=b;
altura=a;
strcpy(identificar,"Triangulo");
}
void Triangulo::Calcular_Area(){
area = ((base*altura) /2);
}
void Triangulo::Dibujar_Figura(){
cout << " * " << endl;
cout << " * * " << endl;
Programación II. Guía 6 5

cout << " * * altura" << endl;


cout << "* * " << endl;
cout << "********** " << endl;
cout << " Base " << endl;
}
void Triangulo::Identificar(){
cout << "Base :" << base << endl;
cout << "Altura:" << altura << endl;
Figuras::Identificar();
}
int main(){
Rectangulo Rec(10,10);
Triangulo Tri(5,5);

// Implementando objeto de la clase rectangulo


Rec.Calcular_Area();
Rec.Identificar();
Rec.Dibujar_Figura();

//Implementando objeto de la clase Triangulo


Tri.Calcular_Area();
Tri.Identificar();
Tri.Dibujar_Figura();
system("pause");
return 0;
}

EJERCICIO No. 1
Agregar una nueva derivación de Figuras con la clase Rombo las propiedades que tendra
el rombo son diagonal mayor y diagonal menor, el área del rombo es
Área Rombo = (Diagonal Mayor * Diagonal Menor) / 2

EJEMPLO No. 2 – Polimorfismo


6 Programación II, Guía 6
La forma mas adecuada de usar el polimorfismo es a través de punteros, el siguiente
ejemplo utiliza un arreglo de objetos para poder definir el concepto. Siempre utilizando el
mismo ejemplo.
Modificar la función main del programa anterior por el siguiente código.

int main(){
// Se crea un arreglo de objetos de la clase Figuras
Figuras *arreglobj[5];
// Ahora se creara crearan 5 objetos para luego ser utilizados por
// el arreglo de objetos
Rectangulo Rec1(15,15);
Rectangulo Rec2(20,20);
Triangulo Tri1(3,5);
Triangulo Tri2(2,6);
Triangulo Tri3(5,5);
// Cada objeto definido anteriormente será un elemento del el arreglo
// donde cada elemento es un puntero a un objeto Figuras aquí se utiliza
// el concepto de polimorfismo
// Se hace referencia a cada objeto creado
arreglobj[0] = &Rec1;
arreglobj[1] = &Rec2;
arreglobj[2] = &Tri1;
arreglobj[3] = &Tri2;
arreglobj[4] = &Tri3;
// Se calcularan las áreas, se Identificara cada objeto y se visualizará su
//información
for(int i=0;i<5;i++){
arreglobj[i]->Calcular_Area();
arreglobj[i]->Identificar();
arreglobj[i]->Dibujar_Figura();
cout << "----------------------------"<<endl;
system("PAUSE");
}
return 0;
Programación II. Guía 6 7

Nota: Un puntero a un objeto de la clase base puede ser utilizado para direccionar un
objeto de cualquiera de sus clases derivadas, lo cual permitirá invocar automáticamente a
través de este puntero a una función declarada virtual correspondiente a la clase del
objeto apuntado.

Investigación
Complementaria
Investigar
¿Qué es una plantilla de Clase y una plantilla de función?
¿Definir el concepto de Genericidad?

Realizar los siguientes ejercicios:


 Crear una jerarquía de clases como se muestra a continuación

Biblioteca

Libros Revistas Artículos

Considerar todas las propiedades y funciones

Bibliografía

En Internet:
http://c.conclase.net/ :
http://www.dcp.com.ar/
8 Programación II, Guía 6

Guía 6: Funciones virtuales y Hoja de cotejo: 6


polimorfismo
1
Alumno: Máquina No:

Docente: GL: Fecha:

EVALUACION

% 1-4 5-7 8-10 Nota

CONOCIMIENTO Del 20 Conocimie Conocimiento Conocimiento


al 30% nto y explicación completo y
deficient incompleta de explicación
e de los los clara de los
fundament fundamentos fundamentos
os teóricos teóricos
teóricos

APLICACIÓN Del 40%


DEL al 60%
CONOCIMIENTO

ACTITUD
Del 15% No tiene Actitud Tiene actitud
al 30% actitud propositiva y proactiva y sus
proactiva con propuestas son
. propuestas no concretas.
aplicables al
contenido de
la guía.
TOTAL 100%

También podría gustarte