uniddad 1 conceptos fundamentales de programación...

60
U.S. Para Obje desar Eiffe camp oche con herra Ingen La im esta u 1.1. P Revi mane De a objet estos otras A la (del i 1 Se ll .B. – Progra comprende etos (O.O.). rrollo de so el, etc), pero pos de las C nta (gracias el planteam amientas de niería de Si mportancia unidad se re Programac saremos el era: “La se o de lo clase med acuerdo a e tos tal cual s serán inst s mediante l programaci inglés Obje lama así al pro amación II er la visión o Inicialmen oftware en o en la actu Ciencias de s al uso pop miento del e Programa stemas (Me de la Progr evisarán los ción Orient concepto POO es un organizan co os cuales re es son tod diante relaci sta definici su nombre ancias 1 de la herencia. ión orientad ect Oriented oceso de efect II Con orientada a nte la Orient algunos len ualidad el P la Computa pular de los UML (Le ación (Leng etodologías ramación O s conceptos tado a obje vertido por n método de omo colecc epresentan das miemb iones de he ión establec lo indica tr determinad da a objetos d Programm tuar una copia ncept Or objetos prim tación a Ob nguajes de Paradigma O ación; cobra lenguajes v enguaje de guajes com y Extension rientada a O fundamenta tos. r Grady Bo e implement ciones coop una instan bro de una renciacida podem rabaja exclu das clases y también se ming). a de la estructu tos Fu de P rienta mero debem bjetos se us programac Orientado a ando verdad visuales) y l modelado mo Java y P nes de UML Objetos es i ales de este ooch, el cu tación en el perativas de ncia de alg a jerarquía os notar qu usivamente y que estas e la identific ura general (cl undam Progr ada a mos definir o para refer ción (C++, Objetos es dera importa llegando a s universal) PHP, Fram L). innegable e paradigma ual se enun l que los pro e objetos, c guna clase, de clases ue la progra con objetos se relacion ca con las si ase)que tenga P Unid ment ramac a Obj que es Orie rirse a la pr smalltalk, A s usado en d ancia a fina su máxima e y un con meWorks, e n la actuali . ncia de la ogramas cada uno y cuyas s unidas amación ori s y que cad nan las unas iglas POO y a un objeto. Página 5 dad 1 tales ción etos entación a ráctica de ADA 95, diferentes ales de los expresión njunto de tc.) y de idad, y en siguiente ientada a da uno de s con las y OOP

Upload: buinhu

Post on 27-Sep-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.

Para ObjedesarEiffecampochecon herraIngen

La imesta u

1.1. P Revimane

De aobjetestosotras A la (del i

1 Se ll

.B. – Progra

comprendeetos (O.O.). rrollo de soel, etc), peropos de las Cnta (graciasel planteam

amientas deniería de Si

mportancia unidad se re Programac

saremos elera:

“La se ode loclasemed

acuerdo a etos tal cual s serán insts mediante l

programaciinglés Obje

lama así al pro

ramación II

er la visión oInicialmen

oftware en o en la actu

Ciencias de s al uso popmiento del e Programastemas (Me

de la Progrevisarán los

ción Orient

concepto

POO es unorganizan coos cuales rees son tod

diante relaci

sta definicisu nombre ancias1 de la herencia.

ión orientadect Oriented

oceso de efect

II

Con

orientada a nte la Orient

algunos lenualidad el Pla Computa

pular de los UML (Le

ación (Lengetodologías

ramación Os conceptos

tado a obje

vertido por

n método deomo coleccepresentan das miembiones de he

ión estableclo indica trdeterminad

da a objetosd Programm

tuar una copia

ncept

Or

objetos primtación a Obnguajes de

Paradigma Oación; cobralenguajes v

enguaje de guajes comy Extension

rientada a Ofundamenta

tos.

r Grady Bo

e implementciones coop

una instanbro de unarencia”

cida podemrabaja exclu

das clases y

también seming).

a de la estructu

tos Fude P

rienta

mero debembjetos se us

programacOrientado a ando verdadvisuales) y l

modelado mo Java y P

nes de UML

Objetos es iales de este

ooch, el cu

tación en elperativas dencia de alga jerarquía

os notar quusivamente y que estas

e la identific

ura general(cl

undamPrograda a

mos definir o para refer

ción (C++, Objetos es

dera importallegando a s

universal)PHP, FramL).

innegable e paradigma

ual se enun

l que los proe objetos, cguna clase,

de clases

ue la progracon objetosse relacion

ca con las si

ase)que tenga

P

Unid

mentramaca Obj

que es Orierirse a la prsmalltalk, A

s usado en dancia a finasu máxima e y un con

meWorks, e

n la actuali.

ncia de la

ogramas cada uno

y cuyas s unidas

amación oris y que cad

nan las unas

iglas POO y

a un objeto.

Página 5

dad 1

tales ción etos

entación a ráctica de ADA 95, diferentes

ales de los expresión njunto de tc.) y de

idad, y en

siguiente

ientada a da uno de s con las

y OOP

Page 2: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 6

Se hace énfasis en el hecho que todo programa para ser considerado Orientado a Objetos debe incluir necesariamente los objetos, las clases y la herencia; en caso de no incluir la herencia será solamente un programa basado en objetos.

Los conceptos fundamentales de POO son: abstracción, encapsulación, objetos, clases, la herencia, los mensajes y el polimorfismo. También se hace notar que los programas OO constan de objetos que se comunican entre sí pasando mensajes.

1.2. Evolución de la POO.

Este enfoque no es moderno y tiene sus orígenes hace mucho tiempo atrás, precisamente en el año 1964 con la distribución del lenguaje Simula, que fue diseñada para facilitar la programación orientada a objetos.

Cuatro años más tarde ha empezado ha cobrar más importancia este paradigma en la conferencia patrocinada por la OTAN en 1968 denominada “Ingeniería del software y Crisis del software”, con estos términos se quería expresar que el software era caro, poco fiable y escaso. Sin embargo se seguían empleando las técnicas y metodologías estructurales en la implementación de diferentes sistemas, durante la década de los 70 y 80 sin poder dar solución a los problemas del software anteriormente detectados y peor aún cuando los sistemas a implementarse adquirían mayor complejidad, es entonces cuando establecen que los costes del mantenimiento requieren más de la mitad de los costos y recursos globales del desarrollo total del software y es entonces cuando dirigen su atención a la programación orientada a objetos; dado que este simplifica y baja notablemente los costos de mantenimiento debido a que estos proporcionan un mecanismo para construir componentes de software reutilizables que además de facilitar el mantenimiento y la seguridad de cada uno de los componentes del sistema estos pueden posteriormente ser interconectados entre sí y formar otros grandes proyectos de software.

1.3. Conceptos Fundamentales de POO 1.3.1. Objetos. Los objetos son concretos y pueden representar a objetos reales o abstractos, están a nuestro alrededor, ellos conforman nuestro mundo. Entonces, se denomina objeto a la instancia de una clase. Por ejemplo cada ser humano pertenece a la clase persona. Un objeto cuenta con una estructura, es decir atributos (atributos – datos) y funciones (acciones – actividades – comportamiento - métodos). Los atributos son las características propias que tiene un objeto; mientras que las funciones son todas las acciones que el objeto es capaz de realizar sobre o con esos atributos. Los atributos y acciones, en conjunto se conocen como características o rasgos Ejemplo:

Page 3: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 7

Un “objeto” puede representar a una Persona

Luis Pérez Varón Atributos 15 años 1,7m

Luis :: nace Luis :: crece Luis :: alimenta Funciones , comportamiento ó acciones Luis :: muere

Para efectuar la representación gráfica del objeto podemos adoptar diversas metodologías como las de Taylor y UML que nos representan a un objeto.

a) Taylor

b) UML

Nombre del Objeto Atributos Funciones

A nuestro alrededor podemos encontrar varios objetos y diversos autores los han clasificado de manera diferente; como la realizada por Shlaer, Mellor y Coad/Yourdon, en los siguientes grupos:

Cosas Tangibles – avión, libro

Roles o papeles – gerente, cliente, empleado

Organizaciones – Equipo, empresa, división

Incidentes – (Sucesos, Eventos) vuelo, accidente

Interacciones – (Transacción, Contratos) Compras, Ventas, Contrato Laboral

Especificaciones – Inventarios, Proformas

Lugares – Sala de Espera, Parqueo, Oficina

Luego se recalca el hecho de que encontramos muchos objetos por doquier en todo lugar y que de acuerdo a nuestras necesidades procedemos a adoptarlos e identificarlos en la resolución de diferentes problemas que se nos planteen.

Page 4: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 8

1.3.2. Clase. Es una descripción de un conjunto de objetos: Consta de Métodos y Datos. Es un TDA2 definido por el usuario que determina las estructuras de datos y sus operaciones asociadas. En POO, una clase no solo tiene el objetivo de categorizar una colección de elementos sino también el de servir como plantilla para crear objetos. Todos los objetos con estados similares y el mismo comportamiento se agrupan en clases. 1.3.2.1. Componentes de una clase: Atributos. Son características específicas que permiten a la clase describir a cada objeto miembro, para efectuar este paso se debe abstraer los elementos más representativos que sean trascendentes en la solución de un problema. A las entidades de la vida real se las puede describir utilizando palabras que identifican características estructurales estables, si a estas características se le asocia un dominio limitado estamos definiendo un atributo. Ejemplo: La Edad (Entero > 0). Abstracción. La abstracción se conoce también como el proceso de generalización en el que se quita todas las propiedades y acciones de un objeto extras que tenga el objeto para dejar solamente aquellas que sean necesarias. En otras palabras “abstracción” significa filtrar las propiedades y operaciones de un objeto hasta que queden solamente aquellas que necesitamos. Según Booch, la abstracción es la: “Supresión intencionada, u ocultamiento, de algunos detalles de un proceso o artefacto, con el objeto de destacar de manera más clara otros aspectos, detalles o estructuras” Encapsulamiento. Es la acción referida a “empaquetar” en una clase los datos (propiedades) y el código (métodos) que opera sobre estos datos. El encapsulamiento está directamente ligado a las características de caja negra que deben tener los programas OO, dado que cuando utilizamos un objeto no necesitamos conocer todos los detalles de la implementación; por lo cual es una buena práctica restringir el

2 Tipo de Dato Abstracto

Page 5: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 9

acceso a los datos y a la información interna de sus métodos, a esto se denomina ocultamiento de datos o encapsulación. 1.3.3. Herencia. Se la define como el mecanismo que se emplea para crear nuevas clases a partir de clases existentes, que fomenta la reutilización de código. El principio en que basa la división de clases en la herencia es la jerarquía (características comunes). La herencia supone una clase base y una jerarquía de clases que contienen las clases derivadas de la clase base, es así como las clases derivadas pueden heredar todas las características de la clase pudiendo añadir cada una de estas subclases su propio código especial y datos propios. Las clases que heredan propiedades de una clase base pueden a su vez servir como definiciones base de otras clases; a su vez las jerarquías de clases se organizan en forma de árbol. 1.3.3.1. Tipos de Herencia.

- Simple En este tipo de jerarquía cada clases tiene como máximo una sola clase base.

- Múltiple

Se refiere a que una clase derivada puede heredar todas las características asociadas a más de una clase base o superclase.

Persona

Profesor

Profesor Universitario

Investigador

Polígono

Triangulo Rectángulo Hexágono

Page 6: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 10

1.3.4. Mensajes entre Objetos. Todos los objetos se comunican entre sí mediante el paso de mensajes, y esta referido a la ejecución de un método asociado con el objeto que lo llama. Luego para enviar mensajes se estipula el nombre del objeto y la acción que se requiere poner en ejecución. En este punto el método definido especifica cómo se ejecuta el mensaje. 1.3.5. Polimorfismo. Es la habilidad de enviar el mismo mensaje a objetos de diferentes clases y que cada objeto responda de una manera particular de acuerdo a su naturaleza. Así por ejemplo se puede enviar el mensaje abrir a los objetos: candado, maletín, periódico y al objeto puerta y todos ellos efectuarán una operación asociada a su naturaleza y se producirá una operación diferente, para cada uno de ellos, a pesar de que la acción tiene el mismo nombre. 1.3.6. Funciones Amigas. Son aquellas funciones que han sido declaradas por la clase como amigas y que no son parte activa de la clase pero por su característica pueden trabajar con los datos y métodos de la clase de manera directa. 1.3.7. Lenguajes Orientados a Objetos. Se tienen en el mercado una diversidad de lenguajes de programación orientado a objetos. El primer lenguaje de POO fue el SIMULA que emergió en el año 1964 y se deriva del ALGOL 60, donde tiene sus raíces, del cual toma el concepto de bloque e introduce el concepto de objeto. Luego se tiene al Smalltalk creado por Alan Kay que ha sido el inspirador de un gran número de lenguajes OO, entre los cuales se mencionan al Eiffel y al C++. Entre los programas más destacados OO que se emplean en la actualidad se mencionan al lenguaje C++, Delphi, JAVA, Object Cobol, Prolog++ y el Smalltalk Ejercicio Propuesto. Realice un mapa mental que explique ¿Qué es la programación orientada a objetos?

Identificando sus componentes.

Page 7: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.

Intro En eque objet 2.1. A Para que atribuIntrínocultelempriva El im

1

2

3

.B. – Progra

oducción.

sta unidad eson fundam

tos.

Abstracció

declarar untienen los utos y lansicamente tación de i

mentos del oados y prote

mpacto que e

1. Nivel Pr Los miemla propiaEsta secc

2. Nivel Pr Los miemelementobase; sinanteriormpor los mde los ele

3. Nivel Pú Los elemcualquierpublic:

ramación II

empezaremmentales pa

n y Encaps

na clase se eobjetos, m

as funcionese da el pro

informaciónobjeto identegidos.

estos nivele

rivado.

mbros declaa clase, medción se iden

rotegido.

mbros declos sin ningún embargo

mente definmiembros dementos la

úblico.

mentos públr función lo

II

Prin

mos a trabajaara trabajar

sulación

empieza idemediante los

es miembroceso de enn, en sí se tificados y

es de segurid

arados en ediante sus funtifica medi

arados en eún problem

o para el nido. En sí de la clase dpalabra rese

licos son deos puede ut

cipios

ar con el lenr con obje

entificando s diagramasro que pu

ncapsulacióneste proce

estos se cla

dad que se e

esta sección unciones miante la pala

este nivel esma por las c

resto actúason de uso

derivada. Seervada prot

e libre accetilizar. Esta

s de P

nguaje C++tos, y dise

previaments UML, enueda tenern mediante eso se preoasifican en

establecen e

de la claseiembro, y la

abra clave p

stán disponclases derivan de man exclusivo p

e identificantected:

eso desde csección se

POO

+ y se cubrireñar un pro

te los caractn los cualer el objetola cual se e

ocupa por ltres grande

en la encaps

e sólo puedeas funcionesrivate:

nibles para pvadas que hnera similapor los mien antecedien

ualquier lugidentifica m

Unida

con C

rá aspectos ograma ori

terísticas prs se identifo a repre

efectúa el prla seguridaes grupos: p

sulación son

en ser utilizs amigas de

poder emplhereden de

ar al nivel embros de lndo a la dec

gar del promediante la

ágina 11

dad 2

C++

centrales entado a

rincipales fican los

esentarse. roceso de d de los públicos,

n:

zados por e la clase.

lear estos la clase

privado la clase y claración

grama, y a etiqueta

Page 8: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 12

En los diagramas UML se generalizan las características del objeto en la declaración de la clase y a todos los elementos que se identifiquen como públicos, se antecede el signo +, mientras que a los que se declaran como privados se colocan el signo -; mientras que a los protegidos no se le incluye signo alguno.

Ejemplo:

Nombre de la Clase- Atributo 1 - Atributo 2 + Atributo 3 Atributo 4

+ Función Miembro 1 - Función Miembro 1 + Función Miembro 1 + Función Miembro 1

2.2. Declaración de una Clase Entendemos como declaración el hecho de establecer la estructura general y sintetizada, o prototipo, de una clase sin especificar el código que es necesario para su funcionamiento. Por otra parte, una clase es un tipo de dato abstracto definido por el usuario que contiene cero o más elementos dato llamado miembros dato, y cero, o más funciones que manipulan esos datos llamados miembros función o función miembro. La sintaxis de una clase es: Una clase es sintácticamente igual a una estructura, con la única diferencia de que en el tipo class todos los miembros son por defecto privados mientras que en el tipo struct3 por defecto son públicos. 3 También podríamos definir una clase empleando el struct, solo que debemos ser cuidadosos de incluir la etiqueta private: a fin de asegurar a los datos como privados.

class nombre_clase{ miembro_1; miembro_2; . . . . . . miembro_N; función_miembro_1() función_miembro_2() función_miembro_3() . . . . . . };

Lista de miembros

Funciones miembro

Page 9: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 13

Ejemplos 1. Como primer ejemplo, el programa contiene a la clase miclase. Al ejecutar este programa podrá ver en pantalla los números 5 y 8. En este ejemplo a es privado, eso significa que solamente las funciones miembro de miclase pueden acceder directamente a ella. Esta es la razón por la que se requiere la función obtiene_n() 2. A continuación se cambia el elemento n a la sección pública de la clase, entonces ya es posible acceder a n desde cualquier ámbito del programa

#include "iostream.h" #include "conio.h" class miclase{ int n; //variable privada de miclase public: void inicializa_n(int num); // funciones int obtiene_n(); // miembro }; void miclase::inicializa_n(int num) { n=num; } int miclase::obtiene_n() { return n; } void main() { miclase ob1, ob2; ob1.inicializa_n(5); ob2.inicializa_n(8); cout << ob1.obtiene_n() << endl; cout << ob2.obtiene_n() << endl; getch(); }

#include "iostream.h" #include "conio.h" class miclase{ public: int n; //variable pública de miclase void inicializa_n(int num); // funcion miembro // ya no hace falta obtiene_n }; void miclase::inicializa_n(int num) { n=num; }

Page 10: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 14

2.2.1 Componentes de una clase Una definición de una clase consta de dos partes: una declaración y una implementación: La declaración lista los miembros de la clase. La implementación o cuerpo define las funciones de la clase. Ejemplo Declaración de una clase Implementación de una clase class numero{ long num; public: void LeerValores(long iniN); long ObtenerValor(); }:

void numero::LeerValores(long iniN) { num=iniN; } long numero::ObtenerValor() { return num; }

Como podemos observar para indicar que la función ObtenerValor es miembro de la clase número se usa la siguiente notación:

long numero::ObtenerValor() Luego de manera general se establece que la estructura para definir completamente a una clase es la siguiente.

class nombre_de_la_clase{ tipo_dato variable; //variables privadas

public: tipo_dato variable; //variables públicas void funcion_1(tipo_dato var); // funciones tipo_dato funcion_2(); // miembro void funcion_n(tipo_dato variable) { //Declaración de función miembro en línea }

}; //Instrumentación de funciones miembro fuera de línea

Funciones miembro

Variables miembro

void main() { miclase ob1, ob2; ob1.inicializa_n(5); ob2.inicializa_n(8); cout << ob1.n << endl; cout << ob2.n << endl; getch(); }

Page 11: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 15

void nombre_de_la_clase:: funcion_1(tipo_dato var) { ……………… } tipo_dato nombre_de_la_clase:: funcion_2( ) { ……………… }

Donde:

• La función miembro declarada en línea, es aquella que esta a disposición del programa inmediamente se declare el objeto, pero esta nunca deberá contener ningún bloque de estructura de control iterativa o de control, ni ser demasiado extensa.

• Todas las funciones miembro deberán ser declaradas, si se requieren procesos un

poco más extensos procédase a declararse fuera de línea, colocando primero el tipo de dato que devuelve esa función miembro fuera de línea, luego el nombre de la clase, después el operador de ámbito :: y finalmente el nombre de la función y los parámetros que esta tuviese.

2.2.2 Control de acceso a una Clase Una de las características fundamentales de una clase es ocultar tanta información como sea posible. Por tanto es necesario establecer ciertas restricciones en el modo en el que se puede acceder a los miembros de una clase. Una clase puede contener elementos:

públicos privados protegidos

Todo miembro de una clase se puede declarar en la sección pública (public) o privada (private) o protegida (protected). Dado que uno de los primero conceptos

Sección privada Sección Protegida Sección Pública

Variable y/o funciones

Variable y/o funciones

Variable y/o funciones

Accesible solamente desde los miembros de la clase

Accesible desde los miembros de la clase y las clases derivadas

Accesible desde cualquier ámbito

Page 12: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 16

fundamentales de la POO es la ocultación de datos, los miembros de una clase van normalmente en la sección private, es decir, son privados, mientras que las funciones que operan sobre los datos son públicas, de modo que se puede acceder a ellos desde el exterior de la clase. Sin embargo aunque no existen reglas fijas, se puede afirmar lo siguiente:

 

Ejemplos  a) Bajo esta consideración podemos presentar el siguiente ejemplo de la declaración de una clase que implementa el encapsulamiento.

}

Implementación de una clase

Para ir de acuerdo con los principios del lenguaje C y la estructura de un programa modular, en C++ se conservan los principios de declaración y definición que se manejan en C. En consecuencia una clase para ser desarrollada y poder ser utilizada debe ser declarada y posteriormente definida. b) En el siguiente ejemplo se ejemplifica el uso de private

Los datos (variables) miembro de una clase deben ser declarados como privados, y la funciones miembro que nos permiten acceder a estos deben ser públicas.

class Ejemplo1 { private: int variableMiembro; float funcionMiembroPrivada( ); // Puede existir funciones

// privadas, si su uso sólo le // interesa a la clase

public: char variableMiembroPublica(); // Pueden existir variables publicas

// si son de poca importancia estructural void funcionMiembro(); protected: int variableMiembroHerencia; // protected reemplaza a private si

// se piensa en herencia. double funcionMiembroHerencia( ); }

class fecha { int dia, mes, año; //privado public: void fijar_fecha(int, int, int); };

Page 13: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 17

La única manera de asignar valores a un objeto fecha ahora es a través de la función pública fijar_fecha (interface del objeto), al pasar el mensaje respectivo, así: c) En el siguiente ejemplo se puede apreciar el uso de la variable protected

Resumen de los modos de acceso a miembros

private protected public

f.miembro f.amiga f.derivada f.usuario

Reglas de ocultación 1. Los miembros dato que no se quiere que se modifiquen desde el exterior, deberían ser

privados o protegidos. 2. Los constructores/destructores deben ser públicos, en la mayoría de las ocasiones. 3. Las funciones que sean usadas para la manipulación interna de datos o que son

invocadas por funciones de la propia clase deben ser privadas o protegidas. 4. El resto será público.

fecha f; f.fijar_fecha(3, 2, 1996);

Page 14: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 18

2.3. Declaración de variables de una clase determinada Un objeto es un elemento declarado de una clase (una instancia de una clase) Ejemplo Objeto es una variable (instancia u objeto) de tipo miclase que se compone de tres campos datos y de una función de acceso. Únicamente las funciones públicas están a disposición de los usuarios de la clase. Sólo las funciones privadas no podrán ser llamadas m´sa que a partir de una función miembro de la clase. Para modificar los campos e e y se escribirá:

objeto.f( ); 2.4 Declaración de funciones miembro La Definición de las funciones miembro es muy similar a la definición ordinaria. Tienen una cabecera y un cuerpo y pueden tener tipos y argumentos, sin embargo poseen dos características importantes:

Cuando se define una función miembro, se utiliza el operador de resolución de ámbito (::) para identificar la clase a la que pertenece la función Las funciones miembro (métodos) de las clases pueden acceder a las componentes privadas de la clase.

Ejemplo 3.5 class c1{ int i; public: void inicia(int x); void print(); }; class c2{ int j; public: void inicia(int x);

void c2::inicia(int x) { j=x; } void c2::print() { cout <<j; } void main()

class miclase{ // definición de la clase int x; // dato privado float y; // dato privado public: int z; // dato público void f(); // función pública }; miclase objeto;

Un objeto es un elemento declarado de un tipo clase. Se conoce también como una instancia de una clase

Page 15: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 19

void print(); }; void c1::inicia(int x) { i=x; } void c1::print() { cout <<i; }

{ c1 ob1; c2 ob2; ob1.inicia(2); ob2.inicia(4); ob1.print(); ob2.print(); }

Como podemos observar, a pesar de que en ambas clases c1 y c2, se define los miembros inicia y print para cada clase tiene una función diferente con respecto de sus datos privados. A los miembros de una clase se accede de igual forma que a los miembros de una estructura. Existen dos métodos para acceder a un miembro de una clase. El operador punto (.) y el operador flecha (->) que actúan de modo similar. La sintaxis de acceso a los miembros dato es:

Nombre_clase.nombre_miembro 

Por ejemplo podemos apreciar que para acceder a la función miembro inicia usamos la siguiente instrucción ob2.inicia(4); Ejemplo. A continuación re realiza la implementación de la clase pila

#include "iostream.h" #include "conio.h" #include "stdlib.h" #define MAX 10 #define TRUE 1 #define FALSE 0 class Pila { int tope; int datos[MAX]; public: void CreaPila(); int PilaLlena(); int PilaVacia(); void Poner(int x); int Quitar( ); void ImprimePila(); };

Definición de constantes

Definición de la clase pila

Funciones miembro

Page 16: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 20

void Pila::CreaPila() { tope=-1; } int Pila::PilaVacia() { if(tope==-1) return TRUE; else return FALSE; } int Pila::PilaLlena() { if(tope==MAX-1) return TRUE; else return FALSE; } void Pila::Poner(int x) { if(PilaLlena()) cout<<"Error la pila esta llena"<<endl; else { tope++; datos[tope]=x; } } int Pila::Quitar( ) {int y = 0; if(PilaVacia()) cout<<"Error la pila esta vacia"<<endl; else { y = datos[tope]; tope --; } return y; } void Pila::ImprimePila() {cout<<"Elementos de la pila"<<endl; for(int i=0; i<=tope;i++) cout<<datos[i]<<" "; }

Page 17: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 21

2.5. Clases Anidadas La potencia de abstracción de una clase se puede incrementar incluyendo otras declaraciones de clase. Una clase declarada en el inferior de otra clase se denomina clase anidada y se puede considerar como una clase miembro. Es posible en C++ anidar clases de forma análoga al anidamiento de estructuras: Ejemplo En el siguiente ejemplo la clase interna se denomina clase anidada, con respecto a Externa El identificador de una clase anidad está sujeto a las mismas reglas de acceso que los restantes miembros. Si una clase anidada se declara en la sección private de la clase circundante, la clase anidada será utilizable sólo por los miembros datos de la clase que la

class Externa{ public: class Interna{ public: int x; }; };

void main() { int aux; Pila p,s; clrscr(); p.CreaPila(); p.Poner(1); p.Poner(2); p.Poner(3); p.ImprimePila(); cout<<"Pila S "<<endl; s.CreaPila(); s.Poner(10); s. Poner (20); s. Poner (30); s.ImprimePila(); aux = s.Quitar(); cout<<"Se elimino "<<aux<<endl; aux = s.Quitar(); cout<<"Se elimino "<<aux<<endl; s.ImprimePila(); getch(); }

Page 18: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 22

circunde. La clase que encierra puede acceder al nombre de la clase anidada sin resolución de ámbito. Si un nombre de una clase anidada es accesible a una clase o función que no la circunda, se debe aplicar el operador de resolución de ámbito (::) y se debe aplicar para utilizar el nombre. Ejemplos 1. Continuando con el ejemplo anterior, 2. 2.6. Constructores y Destructores

2.6.1 Constructores  Muchas variables por lo general requieren de incialización, de hecho en POO prácticamente cada objeto que se crea va a necesitar algún tipo de inicialización. Para tratar esta situación se implementan las funciones constructoras en una declaración de clase. A un constructor de clase.

class X { class Y { int m; } public: class Z { int m; } };

Y y1; //***ERROR*** por no ambito X::Y y1; //***ERROR*** por ser privada Z z1; //***ERROR*** por no ambito X::Z z1; //OK!!

void main() { Externa::Interna valor; int v=valor.x; }

Page 19: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 23

Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase al mismo tiempo que se declara. Los constructores tienen el mismo nombre que la clase, no retornan ningún valor y no pueden ser heredados. Además deben ser públicos, no tendría ningún sentido declarar un constructor como privado, ya que siempre se usan desde el exterior de la clase, ni tampoco como protegido, ya que no puede ser heredado. Características

Tienen en mismo nombre que la clase No devuelven valores Pueden tener parámetros (y valores por defecto) Pueden ser definidos en linea o normalmente Pueden existir más de un constructor para una clase

Cuando declaramos un objeto de una clase, el constructor es invocado automáticamente. Si no definimos uno, el compilador pone el suyo por defecto. Ejemplos 1. En la siguiente clase círculo se ejemplifica el uso de la función constructor

A continuación se aprecia la definición de objetos de clase círculo Como vemos existen dos formas de definir objetos

Un constructor es un miembro de la clase que captura la memoria asociada al objeto.

class circulo { float x_centro, y_centro; float radio; public: circulo(float x, float y, float r) { x_centro = x; y_centro = y; radio = r }

};

Constructor, tiene el mismo nombre de la clase

circulo c; //error faltan parámetros circulo c(2, 3, 1.5); //OK! circulo c = circulo(2, 3, 1.5); //OK!

La mayoría de los lenguajes OO usan este formato

Page 20: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 24

2. Una representación gráfica de la función constructor se muestra a continuación basándonos en la clase Fecha

Se pueden crear objetos de tipo Fecha de la siguiente forma:

 

2.6.1.1 Constructores por defecto  El constructor por defecto es un constructor que no acepta argumentos.

class contador{ long cuenta; public: contador(); void LeerValor(long dato); long DetenerValor(); }; contador::contador() { cuenta=0;

class fecha { int dia, mes, año; public: fecha(int d, int m, int a); void visualizar(void); }; // definición de la función constructor fecha::fecha(int d, int m, int a) { dia=d; mes=m; año=a; } void fecha::visualizar(void) { cout << dia <<”/”<< mes<<”/”<<año<<endl; }

Declaración del

constructor

Se inicializan valores

Fecha hoy(4,10,5); Fecha aniversario(3,12,5);

Page 21: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 25

Ejemplo Este constructor por defecto asigna almacenamiento para construir un objeto de su clase y los pone a cero.

 

2.6.1.2 Constructores con argumentos  La mayoría de los constructores toman argumentos. La función básica de un constructor es inicializar un objeto antes de utilizarlo. Esta inicialización supone funciones llamadoras, asignación de almacenamiento dinámica, establecer variables a valores específicos, etc. Los constructores del ejemplo 3.5 son constructores con argumentos.

 

2.6.1.3 Constructores con argumentos por defecto  Los miembros de una clase se peden inicializar de diferentes formas. Los argumentos por defecto se pueden especificar en la declaración del constructor. Los miembros de las clases se inicializarán a éstos valores por defecto, si ningún otro se especifica.

}

Page 22: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 26

#include "iostream.h" #include "conio.h" class suma{ int a; int b; public: suma(int i=4, int j=5){ a=i; b=j; } void muestra(){cout<<a<<" , "<<b<<endl;} }; void main() { clrscr(); suma ob,ob1(2),ob2(9,7); ob.muestra(); ob1.muestra(); ob2.muestra(); getch(); }

El resultado de ejecutar éste programa será:

 

2.6.1.4 Constructores sobrecargados  Los constructores pueden ser sobrecargados, es decir, un constructor puede tener el mismo nombre, pero diferentes tipos de datos como argumentos. El constructor correcto será invocado por el compilador, según sea el tipo de dato de su argumento. Ejemplo Volvamos a rescribir la clase fecha, ahora con dos constructores:

Page 23: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 27

Si una clase posee constructor, será llamado siempre que se declare un objeto de esa clase, y si requiere argumentos, es obligatorio suministrarlos.

Por ejemplo, las siguientes declaraciones son ilegales:

La primera porque el constructor de "fecha" requiere tres parámetros, y no se suministran. La segunda es ilegal por otro motivo más complejo. Aunque existiese un constructor sin parámetros, no se debe usar esta forma para declarar el objeto, ya que el compilador lo considera como la declaración de un prototipo de una función que devuelve un objeto de tipo "fecha" y no admite parámetros. Cuando se use un constructor sin parámetros para declarar un objeto no se deben escribir los paréntesis. La siguiente declaración es correcta: El resultado de ejecutar el programa será el siguiente:

0/0/0 12/3/08

Fecha ayer(2,5); Fecha fec();

Page 24: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 28

Los valores usados como parámetros se usan para asignar valores a fecha. Realizamos una descripción más detallada:

Fecha aniversario(3,12,5); Ejemplo

2.6.1.5. Constructores de copia  Crean un objeto a partir de otro que ya existe. Se invocan implícitamente cuando se hacen una de estas cosas: Asignaciones entre objetos Paso de parámetros-objeto por valor Por defecto, C++ pone un constructor de copia por defecto que copia byte a byte el objeto en sí, pero que da problemas cuando tenemos datos dinámicos: hay duplicación de punteros pero no de la información apuntada. Se caracterizan por tener como parámetro una referencia constante a un objeto de la clase a la que pertenecen. Ejemplo

class complejo { double re, im; public: complejo(const complejo &c) { //"c" es el objeto a la derecha de la asignación re = c.re; im = c.im; } complejo(double r=0.0, double i=0.0)

Nombre de la clase

Nombre del objeto

Argumentos del constructor

Page 25: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 29

2.6.2 Creación de Objetos  Las dos formas de utilizar constructores para crear instancias de una clase son abreviadas y explícitas. Ejemplos de uso de la forma abreviada para declarar instancias de la clase Complejo es:

Complejo c1, c2(10), c3(3,4); En la forma explícita se utiliza la sintaxis general: Ejemplo

Complejo c1 = complejo(); Complejo c2 = complejo(10) Complejo c3 = complejo(3,4);

2.6.3 Destructores  Miembro de la clase que libera la memoria asociada al objeto de la clase. Se invocan implícitamente cuando acaba el ámbito del objeto. Pueden ser invocados explícitamente con el operador delete. No tienen sentido si no hay memoria dinámica en el objeto. Características

o Tienen en mismo nombre que la clase precedido de tilde "~" o No devuelven valores o No pueden tener parámetros

NombreClase instancia=NombreClase(<Lista argumentos constructor>)

Page 26: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 30

o Pueden ser definidos en linea o normalmente o En una clase puede existir como máximo un constructor.

Ejemplo 3.11

Ejemplo

 

2.7. Funciones Amigas 

Habrá momentos en los que se quiera que una función tenga acceso a los miembros privados de una clase sin que esa función sea realmente un miembro de esa clase. De cara a esto están las funciones amigas. Son útiles para la sobrecarga de operadores y la creación de ciertos tipos de funciones E/S.

El prototipo de esta funciones viene precedido por la palabra clave friend, cuando se desarrolla la función no es necesario incluir friend. Una función amiga no es miembro y no

class pila_char { int tam; char *pila; char *cima;

public: pila_char(int t) { cima = pila = new char[tam = t]; } ~pila_char() { delete []pila; } };

void f() { pila_char p(3); } //aquí se invoca el destructor de la pila void g() { pila_char p(3); //... delete p; // aquí se invoca el destructor de la pila }

Page 27: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 31

se puede calificar mediante un nombre de objeto. Estas funciones no se heredan y pueden ser amigas de más de una clase.

Ejemplo

• Recuerde: Un factor o divisor propio de un número entero n, es un número también entero menor que n que lo divide exactamente, es decir, que el resto de la división de n por su factor propio es exactamente 0.

A continuación se ejemplifica la función amiga factor

• La utilidad de las funciones amigas es poder acceder a los datos privados de una o

más clases

PROTOTIPO: friend tipo_devuelto nombre(parametros); DESARROLLO: tipo_devuelto nombre(parametros) { //cuerpo; }

Declaración de la función amiga

Page 28: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 32

• Una función declarada friend de una clase C, es una función no miembro de la clase, que puede accedes a los miembros privados de la clase

• Una función amiga puede declararse en cualquier sección de la clase. Como no es miembro de la clase no se ve afectada por los modificadores private y public.

• Una función puede ser amiga de una clase y miembro de otra.

 

2.8. Clases Amigas  El caso más común de amistad se aplica a clases completas. Lo que sigue es un ejemplo de implementación de una lista dinámica mediante el uso de dos clases "amigas". Declaración

friend class nombreClase

Page 29: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 33

Ejemplo 2.9. Operaciones con Objetos

2.9.1 Asignación de Objetos  Se puede asignar un objeto a otro a condición de que ambos objetos sean del mismo tipo (misma clase). Cuando un objeto se asigna a otro se hace una copia a nivel de bits de todos los miembros, es decir se copian los contenidos de todos los datos. Los objetos continúan siendo independientes. Ejemplo

objeto_destino = objeto_origen;

#include <iostream.h> #include <stdio.h> #include <conio.h> class miclase{ int a,b; public: void obtener(int i, int j){a=i;b=j;} void mostrar(){cout << a << " "<< b << "\n";} }; void main() { miclase o1,o2; o1.obtener(10,4); o2=o1; o1.show(); o2.show(); getch(); }

Prototipo para que la clase1 reconozca la existencia de la clase2

Clase2 amiga de la clase1

Page 30: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 34

2.9.2 Array de Objeto Los objetos son variables y tienen las mismas capacidades y atributos que cualquier tipo d e variables, por tanto es posible disponer objetos en un array. La sintaxis es exactamente igual a la utilizada para declarar y acceder al array. También disponemos de arrays bidimensionales. Declaración: Inicialización: Ejemplo: Declaración de una arreglo unidimensional

nombre_clase nombre_objeto[nº elementos]; nombre_clase nombre_objeto[nº elementos]={elementos};

nombre_objeto[índice].función(valores);

#include <iostream.h> #include <stdio.h> #include <conio.h>

class ejemplo{ int a; public: void pasar(int x){a=x;} int mostrar() {return a;} }; void main() { ejemplo ob[4]; int indice; clrscr(); for(indice=0;indice<4;indice++) ob[indice].pasar(indice); for(indice=0;indice<4;indice++) { cout << ob[indice].mostrar(); cout << "\n"; } getch(); }

Page 31: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 35

Ejemplo: Declaración de una arreglo bidimensional

 

2.9.3. Paso de Objetos a Funciones  Los objetos se pueden pasar a funciones como argumentos de la misma manera que se pasan otros tipos de datos. Hay que declarar el parámetro como un tipo de clase y después usar un objeto de esa clase como argumento cuando se llama a la función. Cuando se pasa un objeto a una función se hace una copia de ese objeto. Cuando se crea una copia de un objeto porque se usa como argumento para una función, no se llama a la función constructora. Sin embargo, cuando la copia se destruye (al salir de ámbito), se llama a la función destructora.

#include <iostream.h> #include <stdio.h> #include <conio.h> class bidi{ int a,b; public: bidi(int n, int m){a=n;b=m;} int pasa_a(){return a;} int pasa_b(){return b;} }; void main() { clrscr(); int fil,col; bidi objeto[3][2]={ bidi(1,2),bidi(3,4), bidi(5,6),bidi(7,8), bidi(9,10),bidi(11,12)}; for(fil=0;fil<3;fil++) { for(col=0;col<2;col++) { cout << objeto[fil][col].pasa_a() << " "; cout << objeto[fil][col].pasa_b(); cout << "\n"; } } getch(); }

Page 32: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 36

Prototipo de función: Llamada a la función: Ejemplo: 2.9.4 Objetos Devueltos por Funciones Al igual que se pueden pasar objetos, las funciones pueden devolver objetos. Primero hay que declarar la función para que devuelva un tipo de clase. Segundo hay que devolver un objeto de ese tipo usando la sentencia return. Cuando un objeto es devuelto por una función, se crea automáticamente un objeto temporal que guarda el valor devuelto. Este es el objeto que realmente devuelve la función. Después el objeto se destruye, esto puede causar efectos laterales inesperados.

tipo_devuelto nombre(nombre_clase nombre_objeto) { //cuerpo; }

nombre_funcion(objeto);

#include <iostream.h> #include <stdio.h> #include <conio.h> class objetos{ int i; public: objetos(int n){i=n;} int devol(){return i;} }; int sqr(objetos o) { return o.devol()*o.devol(); } void main() { objetos a(10), b(2); cout << sqr(a); cout << sqr(b); getch(); }

Page 33: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 37

Page 34: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 38

Ejemplo:

 

2.9.5 Punteros a Objetos  Hasta ahora se ha accedido a miembros de un objeto usando el operador punto. Es posible acceder a un miembro de un objeto a través de un puntero a ese objeto. Cuando sea este el caso, se emplea el operador de flecha (->) en vez del operador punto. Para obtener la dirección de un objeto, se precede al objeto con el operador &. Se trabaja de igual forma que los punteros a otros tipos. Ejemplo:

#include <iostream.h> #include <stdio.h> #include <conio.h> #include <string.h> class ejemplo{ char cadena[80]; public: void muestra(){cout<<cadena<<"\n";} void copia(char *cad){strcpy(cadena,cad);} }; ejemplo entrada() { char cadena[80];

ejemplo str; cout<<"Introducir cadena: "; cin>>cadena; str.copia(cadena); return str;

} void main() { ejemplo ob;

ob=entrada(); ob.muestra(); getch();

}

#include <iostream.h> #include <stdio.h> #include <conio.h> class miclase{ int a; public: miclase(int x); int get(); };

Page 35: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 39

Ejercicios Propuestos

1. Implementación la clase Dibujo, que muestre el dibuje que desee diseñar.

2. Implemente completamente la clase Pila.

3. Diseñe la clase círculo.

4. Elabore la clase matriz; que efectúe las operaciones principales y la generación de al

menos dos matrices especiales.

5. Diseñe la clase vector, que realice las operaciones fundamentales que se desarrollan

con vectores, además de incluir métodos de búsqueda y ordenación de vectores.

miclase::miclase(int x) { a=x; } int miclase::get() { return a; } void main() { clrscr(); miclase obj(200); miclase *p; p=&obj; cout << "El valor del Objeto es " << obj.get(); cout << "El valor del Puntero es " << p->get(); getch(); }

Page 36: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.

 

Intro En econsicon l 3.1. S El ledefinoperafunciuna f Entoncla sobr 3.2. S A trrepremiem Una

En Cprogrfunci 3.2.1 Mediade la o Así po

.B. – Progra

oducción.

sta unidad sidera primelos cuales se

Sobrecarga

nguaje C++nir funcioneador que yiones y opefunción u op

ces el programarecarga, este po

Sobrecarga

ravés de eesentando cmbro; y es a

función sob

Tienen m

Cada def

Sus argu

C++ se pueramación oiones miem

1. Sobrecar

ante esta propiedotra en función

or ejemplo:

ramación II

Un

se consideraero la define puede inte

a.

+ pone a nues y operadoya ha sido eradores se perador def

ador cuenta conodrá realizar una

a de Funcio

esta propiedcada cual ua esta caract

brecargada s

más de una d

finición difi

umentos pue

eden sobrecorientada a

mbro, empez

rga de const

dad podemos da sus parámetro

II

nidad 

arán los aspición de soeractuar al e

uestra disposores que utiincorporadadice que es

finido.

n más herramiena sobrecarga de

ones.

dad dos oun código dterística que

se distingue

definición p

iere en el nú

eden contem

cargar todaa objetos dzando por lo

tructores.

definir distintos os. A estos tamb

pectos fundaobrecarga, luestar progra

sición todasilizan el mia pero questán sobreca

ntas que le ayude funciones y de

o más funcdiferente, qe se la conoc

e básicamen

para el mism

úmero de ar

mplar difere

s las funciode manera os constructo

constructores abién se los cono

amentales duego se exa

amando en C

s las herramsmo nombr

e cuentan cargadas y se

darán a impleme operadores, qu

ciones pueque incide ce como sob

nte por los s

mo nombre

rgumentos.

ntes tipos d

ones que ssimilar po

ores y tamb

al momento de doce como copia

Sob

de la sobrecaminan los C++.

mientas necere o símbolocon un códie pueden ut

mentar su prograue se considera

den tener en la ejecubrecarga de

siguientes as

de función.

de datos.

e definan; odemos sobbién las fun.

definir una clasa de constructor

breca

arga, para ltipos de so

esarias que o que una figo diferentilizar para

ama. En lo concarán a continuac

el mismo ución de lae funciones.

spectos:

mientras qbrecargar t iones ami

se. Y se distingures.

ágina 40

arga

lo cual se obrecarga

permiten función u nte. Estas

redefinir

cerniente a ción.

nombre a función

que en la todas las igas.

uirán la una

Page 37: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 41

class ejemplo{ //atributos public: ejemplo( );

ejemplo(int ); ejemplo(float); ejemplo(int , float); ejemplo(double, float, int);

}; Los cuales en el momento de crearse un objeto efectuaran las tareas que se hayan programado de acuerdo a los argumentos enviados.

Ejemplo( 7 ); //Aquí se ejecuta las instrucciones que se hayan declarado en el //constructor cuando recibe un parámetro entero.

3.2.2. Sobrecarga de funciones miembro. Mediante esta propiedad se puede declarar cualquier función miembro sobrecargada, preparándonos de esta forma para cualquier caso en el cual se invoque la función miembro que varía de acuerdo a los parámetros que se le envíen. Con este fin solo se toman en cuenta las reglas expresadas en el punto de sobrecarga. Como ejemplo consideremos la siguiente definición de clase: class ejemplo{ public: ejemplo( );

void saludo ( ); //Sobrecarga de la //función miembro saludo

void saludo ( char *cad); };

void ejemplo::saludo( )

{ cout<<”Hola!”; } void ejemplo::saludo( char *cad) { cout<<”Hola “ <<cad<<”!”; }

Y cuando se les envíen los mensajes de acuerdo a los parámetros que se les envíe actuarán: ejemplo amigo; //Creación del objeto amigo amigo.saludo( ); // Mostrará el mensaje Hola! amigo.saludo(“Ana” ); // Mostrará el mensaje Hola Ana! 3.2.3. Sobrecarga de Funciones Amigas. La sobrecarga de funciones amigas se realiza de manera similar a la sobrecarga de funciones miembro, con la única diferencia de insertar en su declaración la palabra friend, al igual que se realiza en cualquier declaración de una función amiga. Luego se aplican las mismas reglas consideradas en la sobrecarga. class ejemplo{ int val; public: ejemplo( );

Page 38: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 42

ejemplo(int ); friend int lee( ); friend float lee( ); friend long lee( );

}; int leer ( ) { return val; } float leer ( ) { return ((float)val); } long leer ( ) { return ((long)val); }

Ejemplo. Programa que aplica la sobrecarga de funciones para introducir los datos de un empleado que se contrata para trabajar en una empresa. #include "iostream.h" #include "stdio.h" #include "conio.h" #include "string.h" class empleado{ char nombre[40]; char cargo[30]; float sueldo; public: //SOBRECARGA DE LA FUNCIÓN INTRODUCE void introduce(); void introduce(char nom[],char car[]); void introduce(char car[],float sueldo); void muestra(); }; void empleado::introduce() { cout<<"NOMBRE COMPLETO:"; gets(nombre);

Page 39: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 43

cout<<"CARGO: "; gets(cargo); cout<<"SALARIO: "; cin>>sueldo; } void empleado::introduce(char nom[], char car[]) { cout<<endl<<"El empleado: "<<nom<<" cuyo cargo es: "<<car; cout<<endl<<"ganar : "; cin>>sueldo; strcpy(nombre,nom); strcpy(cargo,car); } void empleado::introduce(char car[], float s) { cout<<endl<<"Introduciendo los datos para el cargo:"<<car; cout<<endl<<"Cuyo sueldo B sico es: "<<s; cout<<endl<<"Introduzca el nombre del empleado contratado: "; gets(nombre); strcpy(cargo,car); sueldo=s; } void empleado::muestra() { cout<<endl<<"__________________________________"; cout<<endl<<"NOMBRE DEL EMPLEADO: "<<nombre; cout<<endl<<"CARGO QUE OCUPA: "<<cargo; cout<<endl<<"SUELDO: "<<sueldo; cout<<endl<<"__________________________________"<<endl; } void main() { empleado obrero; //Creación del objeto obrero clrscr(); obrero.introduce(); obrero.muestra(); obrero.introduce("JUAN CALLE", "MENSAJERO"); obrero.muestra(); obrero.introduce("TRANSCRIPTOR",1.752); obrero.muestra(); getch(); } 3.3. Sobrecarga de Operadores.

Page 40: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 44

Mediante esta propiedad se permite al programador dar nuevos significados a los símbolos de los operadores existentes en C++. Los operadores que se pueden sobrecargar son:

+, -, *, /, %, ^, &, |, _, ', =, <, >, <=, >=, ++, --, <<, >>, ==, 0, %%, ||, +=, -=, *=,

/=, %=, &=, |=, <<=, >>=, [ ], ( ), ->, ->*, new, delete.

Si un operador tiene formatos unitarios y binarios (tales como ++ y +) ambos formatos pueden ser sobrecargados. Un operador unitario tiene un parámetro, mientras que un operador binario tiene dos. El único operador ternario, ?:, no se puede sobrecargar. La sobrecarga de operadores en C++ tiene una serie de restricciones que es necesario tener presente a la hora de manejar operadores sobrecargados:

Se pueden sobrecargar sólo los operadores definidos en C++.

La sobrecarga de operadores funciona sólo cuando se aplica a objetos de una clase.

No se puede cambiar la preferencia o asociatividad de los operadores en C++.

No se puede cambiar un operador binario para funcionar con un único objeto.

No se puede cambiar un operador unitario para funcionar con dos objetos.

Los operadores sobrecargados no pueden tener argumentos por defecto.

Para sobrecargar un operador, se debe definir lo que significa la operación relativa a la clase a la cual se aplica. Para hacer esta operación, se crea una función operador, que define su acción. Sintaxis para sobrecargar un operador El formato general de una función operador es el siguiente:

tipo nombre_clase :: operator op (lista_argumentos) {...} donde:

tipo: es el tipo del valor devuelto por la operación especificada. Los operadores sobrecargados, con frecuencia tienen un valor de retorno que es del mismo tipo que la clase para la cual el operador se sobrecarga. operator: Es la palabra reservada que indica que se trata de una sobrecarga de operadores, luego el nombre de la función es operator. op: Es el operador que se sobrecarga.

Page 41: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 45

4.3.1. Sobrecarga de operador Unario.

Medio por el cual se pueden dar un nuevo comportamiento a todos los operadores unarios.

Ejemplo:

class vector { double x,y; public: void iniciar(double a, double b){x=a; y=b;} void visualizar() { cout<<"vector "<<x<<","<<y<<endl; } double operator++(){x++; y++;} };

void main() { vector v; v.iniciar(2.5 , 7.1); v++; v.visualizar(); // visualiza 3.5 8.1 }

3.3.2. Versiones prefija y postfija de los operadores unarios: ++ y - -

La versión prefija del operador de incremento se sobrecarga definiendo una versión de ++ de un parámetro; la versión postfija se sobrecarga definiendo una versión de ++ de dos parámetros, siendo el segundo de tipo int (será un parámetro mudo).

Sobrecargar un operador unitario como función miembro.

class c { int x; public: c( ) {x=0;} c(int a) {x=a;} c& operator--( ) {--x; return *this; } void visualizar( ) {cout<<x<<endl;} };

Page 42: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 46

void main() { c ejemplo(6); --ejemplo; //ejemplo.operator--(); ejemplo.visualizar( ); --ejemplo; ejemplo.visualizar( ); }

La función --( ) está declarada; ya que es una función miembro, el sistema pasa el puntero this implícitamente. Por consiguiente, el objeto que llama a la función miembro se convierte en el operando de este operador.

3.3.3. Sobrecarga de operadores binarios.

Los operadores binarios se pueden sobrecargar pasando a la función dos argumentos. El primer argumento es el operando izquierdo del operador sobrecargado y el segundo argumento es el operando derecho. Suponiendo dos objetos x e y de una clase c, se define un operador binario + sobrecargado. Entonces x + y se puede interpretar como operator+(x,y) o como x.operator+(y)

El siguiente ejemplo muestra cómo sobrecargar un operador binario como una función miembro:

class binario { int x; public: binario() {x=0;} binario(int a) {x=a;} binario operator + (binario &a); void visualizar() {cout<<x<<endl; };

binario binario :: operator +(binario &a) { binario aux; aux.x=x+a.x; return aux; }

void main() { binario primero(2),segundo(4),tercero; //Declarando tres objetos tercero = primero + segundo; tercero.visualizar(); }

La salida del programa es 6.

Page 43: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 47

Ejercicios Propuestos

1. Diseña un programe que sobrecargue la función dibuja de la clase ELIPSE.

2. Sobrecarga los operadores ++ y -- que amplíen y disminuyan el tamaño de una

línea en el eje x. Además implemente el operador * para duplicar líneas.

3. Implemente la clase matriz que sobrecargue la función de cargado de datos a la

matriz, luego, sobrecargue los operadores + para sumar dos matrices, - para restar

los elementos de dos matrices y ++ para invertir una matriz.

Page 44: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.

 

Comdispoproceunida 4.1. H Sin dues el p BásicexistotrosLa he 4.2. J Surgse paque sclase Base

 

4.3. CEn recanti

.B. – Progra

mo es de nuoner de bieeso en la pad.

Herencia

uda es la caracteproceso de crear

camente setente. De ess objetos, aberencia pue

Jerarquía d

ge fundamenarte de una se conocen es derivadas

e

   

D

D

Control de ealidad al esidad de elem

ramación II

UniHere Intr

estro conoc

enes que haprogramació

erística más potr nuevas clases,

e afirma qusta forma lobriendo el cede ser simp

de Clases

ntalmente dclase base como hijos

s, conformán

   

Derivada 1.1

Derivada 1.1

Accesos a stablecer el mentos de la

II

idad 4ncia y Jera

roducción

cimiento púayan pertenón y es pre

tente de la progr, llamadas clase

ue la herenos objetos samino para

ple o múltipl

de la derivacdenominad

s, estos a sundose de es

Derivad

1 D

1.1.

la Clase Baacceso que

a clase base

4

arquía de C

úblico la henecido a otrecisamente

ramación orienes derivadas, a p

ncia se aplse pueden ccompartir c

le.

ción de clasda padre, deu vez puedsta forma la

da 1   

Derivada 1.2

ase e tendrá cad que serán h

Clases

erencia es era persona,

este aspec

ntada a objetos, partir de una ex

lica para exconstruir decódigo y est

ses que se pe la cual seen llegar a jerarquía d

Derivad

2

a clase derivheredados p

l proceso pde manera

cto que se

después de las xistente clase de

xtender y re modo incrtructura de

producen, ee pueden cre

constituirsede clases.

da 2 

vada lo quepor la clase

por el cual pa análoga seconsiderará

clases. Donde, enominada clas

reutilizar eremental a datos.

en principioear clases de en padres

e se especifiderivada.

ágina 48

podemos e da este á en esta

la herencia e base.

el código partir de

o siempre derivadas s de otras

ica es la

Page 45: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 49

La sintaxis en lenguaje C++ para establecer la derivación de una clase base es: class nombre_clase_base { private : //opcional . . . protected : . . . public : . . . } ; class nombre_clase_derivada:tipo_de_acceso { .........................

}; Donde el tipo de acceso puede ser: public, private y protected, y dependiendo de esto se determinará los elementos de los cuales podrá disponer la clase derivada. Estos se presentan de manera esquemática, así:

Acceso a los Miembros de la Clase Base

Private Public ProtectedClase base SI SI SI Clase derivada tipo public NO SI SI Clase derivada tipo private NO SI NO Clase derivada tipo protected NO SI SI Clase derivada tipo public desde programa principal NO SI NO Clase derivada tipo private desde programa principal NO SI NO Clase derivada tipo protected desde programa principal NO SI NO

En base a estos principios se guían las herencias simples y múltiples. 4.4. Herencia Simple. La herencia simple se realiza tomando una clase existente y derivando nuevas clases de ella. Ejercicio: Defina los esquemas para definir la herencia entre estudiante y calificaciones. #include <iostream.h> #include <conio.h>

Page 46: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 50

#include <stdio.h> //clase base o padre class estudiante { long int ru; char nom [20] ; //Almacenar el nombre del estudiante char ape[30]; char dir[25]; char tel[7]; char celu[8]; public : void introduce( ) ; void muestra(); }; void estudiante:: introduce ( )

{ cout<<endl<<”R.U.: ”; cin >>ru; cout<<”Nombres: ”; gets(nom) ; cout<<”Apellidos: ”; gets(ape) ; cout<<”Dirección: ”; gets(dir) ; cout<<”Telefono: ”; gets(tel) ; cout<<”Celular: ”; gets(celu) ; }

void estudiante:: muestra( )

{ cout<<endl<<”Estos son los datos del estudiante: ”; cout<<endl<<”R.U.: ”<<ru; cout<< endl<<”Nombres: ”<<nom ; cout<< endl<<”Apellidos: ”<<ape ; cout<< endl<<”Dirección: ”<<dir ; cout<< endl<<”Telefono: ”<<tel ; cout<< endl<<”Celular: ”<<celu ; }

//clase derivada o hija de estudiante class calificaciones_sis507: public estudiante { int nota; public : void asigna( ){ cout<<endl<<”Nota: ”; cin>>nota;} int lanota() { return nota;} }; void main( ) { calificaciones_sis507 alumno; int n;

Page 47: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 51

alumno. introduce ( ); alumno.asigna( ); n =alumno.lanota( ); alumno.muestra( ); cout<<"La nota es: "<<n; getch( ); }

 

4.5. Constructores y destructores en herencia  Los constructores y destructores de la clase base no se heredan por clases derivadas. En su lugar, los constructores de las clases hijas deben contener información de parámetros de los constructores de la clase base. La llamada a un constructor de una clase base se hace del mismo modo que las llamadas a los constructores de los miembros objeto. El nombre de la clase base se da seguida por la lista de parámetros del constructor: cabecera función : nombre_clase_base ( a1, a2, . . . ) lista de argumentos Es posible que una clase padre y otra hija tengan cada una su función de construcción. Cuando una clase derivada contiene un constructor, se ejecuta el constructor base antes de ejecutar el constructor de la clase derivada. class Base { public : Base ( ) { cout << “\n La clase Base ha sido creada” ; } } ; class Derivada : public Base { public : Derivada ( ) { cout << “La clase derivada ha sido creada” ; } } ; void main ( ) { Derivada der ; } El programa muestra: La clase Base ha sido creada. La clase Derivada ha sido creada. La función de destrucción de una clase hija se ejecuta antes que la de la clase padre. Esto es así ya que la destrucción de la clase padre implica la destrucción de la hija, así que el

Page 48: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 52

destructor de ésta debe ser ejecutado antes de ser destruido.

4.6. Herencia múltiple  La herencia múltiple consiste en la posibilidad de una clase de heredar más de una clase a la vez. Por ejemplo: class A { // clase base o padre A . . . } ; class B { // clase base o padre B . . . } ; class AB : public A, public B { // AB herencia de A y de B . . . }; Si la clase X tiene un constructor con parámetros, éstos se pueden pasar a cada clase base, como se indica a continuación:

AB : : AB { ( int n = 0, float x = 0, char car = ‘A’ ) : A ( n, car ), B ( n, x ) { . . . }

La creación de un objeto de clase AB hace que los tres constructores de A, B y AB sean llamados en este orden: //clase Base1 class Base1 { protected : int b1 ; public : void set ( int i ) { b1 = i ;} } ; //clase Base2 class Base2 { int b2 ; public :

Page 49: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 53

void set ( int i ) { b2 = i ; } int leer ( ) { return b2 ; } } ; //hereda de Base1 y de Base2 class Derivada : public Base1, private Base2 { public : void imprimir ( ) { printf ( “b1 = %d y b2 = %d”, b1, leer ( ) ); } } ; 4.7. Ejemplos Sencillos de Herencia. 1. /* PROGRAMA SENCILLO DE HERENCIA */ # include "stdio.h" # include "iostream.h" # include "conio.h" // Clase Base class Base{ protected: int a; public: void inicializaB(int iniA){a=iniA;} void muestraB(){cout<<"Elemento de la clase Base "<<a<<endl;} }; // Clase Derivada class Derivada:public Base{ int da; public: void inicializaD(int iniA){da=iniA;} void operator!(); void muestraD() { cout<<"Elemento de la clase Derivada "<<da<<endl; } }; void Derivada::operator!() { da=57; a=75; }

Page 50: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 54

void main() { Derivada obD; //Declarando un objeto derivado clrscr(); obD.inicializaB(4); obD.inicializaD(5); obD.muestraB(); obD.muestraD(); !obD; obD.muestraB(); obD.muestraD(); getch(); } 2. // Herencia con constructores # include "stdio.h" # include "iostream.h" # include "conio.h" // Clase Base class Base{ int a; public: Base(int iniA){a=iniA;} void muestraB(){cout<<"Elemento de la clase Base "<<a<<endl;} }; // Clase Derivada class Derivada:public Base{ int da; public: Derivada(int iniA,int iniDA):Base(iniA) { da=iniDA; cout<<"Constructor de la clase Derivada "; } void muestraD() { cout<<"Elemento de la clase Derivada "<<da<<endl; muestraB(); } }; void main() { clrscr();

Page 51: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 55

Derivada obD(15,7); obD.muestraB(); obD.muestraD(); getch(); }

Ejercicios Propuestos

1. Represente la clase Animal mediante las relaciones de herencia, cree al menos dos clases derivadas.

2. Implemente la clase Teatro e incluya la representación de herencia múltiple.

3. Diseñe un programa en el que incluya relaciones de herencia, y constructores para

representar a los arreglos.

Page 52: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.

Intro Ambque tdesar 5.1. F Una redefdeclaparámCadaespecvirtu Ejem #incl#incl#incl classpubli }; classpubli }; classpubli

.B. – Progra

oducción.

bos conceptotrabajan en rrollará en e

Funciones V

función virfine en unaaración de lmetros y dea redefiniciócifico de laal en una cl

mplo:

lude<iostrealude<stdio.hlude<conio.

s base{ ic:

int i; base ( intvirtual v

s derivada1:ic:

derivadavoid func

s derivada2:ic:

ramación II

os están estrlas clases besta unidad.

Virtuales

rtual es miea clase derla función l

evolver el món de la fu

a misma conlase derivad

am.h> h> .h>

t x ){i =x;} void func( )

public base

a1(int x):basc(){ cout <<

public base

II

rechamentease y deriva.

embro de unrivada. Parala palabra c

mismo tipo.unción virtun respecto ada NO es ne

(){cout<<i

e{

se(x){}; <i*i<<"\n";

e{

Fu

e ligados conadas de una

na clase quea crear unaclave virtua

ual en una a esa clase ecesaria la p

i<<"\n";}

}

uncion

n el tema dea manera par

e se declaraa función val. Debe ten

clase derivaderivada. C

palabra virtu

nes ViPolim

e la herencirticular y es

a dentro de virtual hay ner el mism

ada expresaCuando se rual.

Unid

irtualmorfis

a y son extes lo que se

una clase bque prece

mo tipo y nu

a el funcionredefine una

ágina 56

dad 5

les y smo

ensiones

base y se eder a la umero de

namiento a función

Page 53: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 57

derivada2(int x):base(x){}; void func(){cout<<i+i;} }; void main() { base obj1(10); derivada1 obj2(10); derivada2 obj3(10); obj1.func(); obj2.func(); obj3.func(); getch(); } 5.2. Polimorfismo Este concepto deriva del griego poli que significa muchos y morfos que quiere decir forma, luego esto nos da la idea de que la clase tenga la posibilidad de que sus métodos o propiedades se comporten de manera diferente, y de esa manera se cuenta con múltiples formas. Luego, el polimorfismo hace posible que se tengan comportamientos diferentes, asociados a diferentes objetos, los cuales pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. Por ejemplo, si trabajamos con figuras geométricas, tales como: un círculo y un cuadrado los cuales se dibujan de diferente forma y tienen diferentes áreas. Usando el polimorfismo se puede enviar a cada una de las formas el mismo mensaje; así, si envío el mensaje Dibuja al objeto circulo este realizará la acción debida dibujando un círculo. Otro ejemplo se da si se cuando se envía un mensaje "+" a un objeto entero que significaría suma, mientras que para un objeto string significaría concatenación, unir strings uno seguido al otro. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. El Polimorfismo se puede aplicar tanto a funciones como a operadores. En síntesis el polimorfismo significa que objetos similares pueden responder al mismo mensaje de diferentes maneras.

Page 54: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 58

5.3. Ejemplo Completo de Polimorfismo /* EJEMPLO DE POLIMORFISMO Y FUNCIONES VIRTUALES DONDE FIGURA ES LA CLASE BASE Y LAS CLASES DERIVADAS SON CIRCULO Y RECTANGULO */ #include <stdio.h> #include <graphics.h> #include <iostream.h> #include <stdlib.h> #include <conio.h> #include <math.h> #include <dos.h> #include <ctype.h> #include <string.h> #define L(t) ((t>='A'&&t<='Z')||(t>='a'&&t<='z')||t==' '||t=='.'||(t>='0'&&t<='9')||t==','||t==';')?1:0 //Prototipos de funciones de modo gráfico para lectura de valores void lee(char *msg, int x, int y, char *cad); void cursor(int x, int y, int pos); // Definicion de la clase figura Plana class FIGURA { protected: int col; // Color de la figura public: FIGURA(){ col = BLUE;} void elcolor(int c) { col = c; } virtual void dibuja( ){ } //Clase Virtual que indica el polimorfismo virtual void area( ){ } virtual void datos( ){ } };

Page 55: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 59

// Definicion de la clase CIRCULO que se hereda de FIGURA class CIRCULO:public FIGURA { int xc, yc, r; float pi; public: CIRCULO(){ xc= getmaxx()/2; yc= getmaxy()/2; r=50; pi = 3.14;} void dibuja(){setcolor(col); circle(xc,yc,r);} void datos(){ char buffer[30]; outtextxy(10,10,"Introduzca los datos para del circulo:"); lee("X:", 10, 20,buffer); xc = atoi(buffer); //Convierte a numero entero lee("Y:", 10, 30,buffer); yc = atoi(buffer); lee("Radio:", 10, 40,buffer); r = atoi(buffer); } void area(); }; void CIRCULO::area( ) { char buffer[30]; float res = 2*pi*r; sprintf(buffer,"El area del circulo es de: %.2f",res); outtextxy(10,70,buffer); } //Realiza la derivacion de la clase Rectangulo void modografico() { int gd=DETECT, gm, error; initgraph(&gd,&gm,"c:/borlandc/bgi"); error = graphresult(); if (error!= grOk) // ocurrio un error { cout<<"ERROR: "<<grapherrormsg(error)<<endl; cout<<"Presione alguna tecla para continuar..."; getch(); exit(1); //Termina el programa } else cleardevice(); //Borra la pantalla }

Page 56: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 60

void lee(char *msg, int x, int y,char *cad) { char t,d[7];unsigned int pos=0,c=getcolor(); strcpy(cad,""); setcolor(14); outtextxy(x,y,msg); setcolor(15); x+=strlen(msg)*8+20; setfillstyle(1,0); do{ cursor(x,y,pos); t=getch(); sprintf(d,"%c",t); if((L(t))&&(t!=13)) { outtextxy(x+(pos*8),y,d); cad[pos]=t; pos++; } }while(t!=13); cad[pos]='\x0'; setcolor(c); } void cursor(int x, int y, int pos) { int i,color=getcolor(); do{ setcolor(7); setwritemode(1); line(x+pos*8,y+9,x+pos*8+7,y+9); for(i=1;i<50;i++); line(x+pos*8,y+9,x+pos*8+7,y+9); setcolor(color); }while(!kbhit()); } void main( )

{

modografico( );

float areac;

CIRCULO c;

Page 57: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 61

c.dibuja();

getch();

cleardevice();

c.datos();

c.area();

c.dibuja();

getch();

}

Ejercicios Propuestos

1. Implemente el polimorfismo en las clase Mueble, para el cual cree tres clases

derivadas.

2. En la clase base Animal y las clases derivadas: Mamifero y Oviparo implemente el

polimorfismo

Page 58: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.

6.1. P En Cuna pde una los EstasDenvde retipos Los cversifunci

La sipero plant

Ejem Un ejvariamane

.B. – Progra

Plantillas

C++ los tipopropiedad qno o más des diferentes

s fueron prver en 1988endimiento s de datos.

compiladoreión 3.0 de Ciones y las d

intaxis parase añade a

tilla:

mplo.

ejemplo de pables que tenera:

ramación II

os de datosque permitee sus parámusos sin ten

ropuestas p8, y su fuerz

y no sacrif

es que nos pC++; y en esde clases.

a declarar unl principio

temp<tipo{ // D};

plantilla de ngan cualqu

II

Plan

s genéricos e definir un

metros; de esner que rees

por Stroustza radica enfica las ven

permiten trasta versión s

na plantilla una present

plate < classo_retorno> <Declación d

función pueuier tipo de

ntilla

son llamada clase o unsta manera scribirla.

trup en la n el hecho dntajas del C

abajar con pse propone

de función tación de la

s|typename <identificadde función

ede ser la qudato, para l

as y Tr

dos plantillana función se puede ca

conferenciade que la ge

C++ en mat

plantillas, teen realidad

es parecidaa clase que

<id>[,...] >dor>(<lista_

ue encuentrlo cual esta

ratamExc

as de clasesin especifiambiar la c

a USENIX eneralidad teria de con

emplates, edos tipos d

a a la de cuase usará co

> _de_paráme

ra el valor mse instrume

Unid

mientocepcio

e. La generificar el tipo clase para a

C++ realno arrastrantrol estric

s a partir dede plantillas:

alquier otraomo referen

etros>)

máximo de denta de la si

ágina 62

dad 6

o de ones

icidad es de datos

adaptarla

lizada en a pérdida to de los

e la : las de

a función, ncia en la

dos iguiente

Page 59: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 63

template <class T> T max(T x, T y){ return (x > y) ? x : y ;

};

La sintaxis para declarar una plantilla de clase es parecida a la de cualquier otra clase, pero se añade al principio una presentación de la clase que se usará como referencia en la plantilla:

template < class|typename <id>[,...] >

class <identificador_de_plantilla>

{ // Declaración de funciones // y datos miembro de la plantilla

}; Ejemplo. template <class T> class tabla{ public: tabla( ); ~tabla( );

}; 6.2. Tratamiento de Excepciones Muchas veces al ponernos a programar podemos cuestionar la seguridad que nuestro programa ofrece, es entonces cuando el tratamiento de excepciones entra en juego, posibilitándonos incluir seguridad a los programas que realicemos.

El tratamiento de excepciones es un mecanismo de gestión de errores incorporado que permite gestionar y responder a los errores en tiempo de ejecución. Las excepciones están construidas a partir de tres palabras clave: try, catch y throw. Cualquier sentencia que provoque una excepción debe haber sido ejecutada desde un bloque try o desde una función que este dentro del bloque try.

Cualquier excepción debe ser capturada por una sentencia catch que sigue a la sentencia try, causante de la excepción.

Su sintaxis es: try{

Page 60: Uniddad 1 Conceptos Fundamentales de Programación ...virtual.usalesiana.edu.bo/web/contenido/dossier/22011/716.pdf · herencia será solamente un programa basado en ... instancia

U.S.B. – Programación III Página 64

//cuerpo; } catch(tipo1 arg) { //bloque catch; } catch(tipo2 arg) { //bloque catch; } catch(tipoN arg) { //bloque catch; }

Ejemplo. #include<iostream.h> #include<stdio.h> #include<conio.h> void main( ) { try{ cout<<"Dentro del bloque try\n"; throw 10; cout<<"Esto se ejecuta si no hay problemas"; }

catch(int i){ cout<<"Capturado el error "<< i; cout<<"\n"; } cout << "fin"; getch();

}

Ejercicios Propuestos

1. Implemente la clase Listas para que trabaje con distintos tipos de elementos.

2. Diseñe la clase Colas completamente para que sea genérica y trabaje con diferentes

tipos de datos.