1 Herencia Agustín J. González ELO329. 2 Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases que tienen algo en común.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Clases en C++.
Herencia en C#.
Lenguaje de programación Java
Arquitectura CLARO-TECNOTREE
Polimorfismo Unidad 4.
Informática II Prof. Dr. Gustavo Patiño MJ
Herencia y Polimorfismo
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Herencia e Interfaces.
Programación Orientada a Objetos usando C++
Modificadores.
Herencia y Polimorfismo en JAVA
Lic. Rosemary Torrico Bascopé
Abstracción de los datos y Orientación a Objeto Clase 13.
Clases y objetos La unidad fundamental de programación OO son las clases. Conjunto de métodos y semántica Qué se va a hacer POO Clase: que define la implementación.
Tema 6: Clases Antonio J. Sierra.
1 Interfaces Agustín J. González ELO Introducción En C++ se permite la herencia múltiple; es decir, es posible derivar una clase de dos o más clases.
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
1 Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
1 Asignación Dinámica de Memoria Agustín J. González Versión original de Kip Irvine ELO 329.
Clases en C++ Agustín J. González ELO329.
1 Polimorfismo y Funciones Virtuales Agustín J. González ELO329.
1 Introducción a Clases Agustín J. González ELO329.
Manejo de Punteros y objetos en memoria dinámica en C++
UNIDAD VI Recursos esenciales de Java LSC. Natalia Rodríguez Castellón.
Metodología de Programación Ayudantía 5 lelagos.ublog.cl 2009.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González ELO329.
1 Introducción a Clases Agustín J. González Versión original de Kip Irvine ELO329.
1 Definición y Conversión de datos Agustín J. González ELO-329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO326: Seminario II 2do. Sem
1 Herencia Agustín J. González Versión original de Kip Irvine ELO320: Seminario II 2do. Sem 2001.
Clases y Objetos en Java ELO329: Diseño y Programación Orientados a Objetos.
1 Polimorfismo y Funciones Virtuales Agustín J. González Versión original de Kip Irvine ELO329.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend) Agustín J. González Versión Original de Kip Irvine ELO329.
Programación Orientada a Objetos
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
1 Asignación Dinámica de Memoria Agustín J. González ELO 329.
Programación orientada a objetos
Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
El lenguaje C++ Isidro González Caballero (Universidad de Oviedo) Técnicas de Comp. en Física Santander, 13/12/
1 Interfaces Agustín J. González ELO Introducción En C++ se permite la herencia múltiple; es decir, es posible derivar una clase de dos o más clases.
1 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend)‏ Agustín J. González ELO329.
HERENCIA.
Programación orientada a objetos Capítulo 9 Algo mas sobre herencias.
1 Herencia Agustín J. González ELO padre hijo Como en biología, los niños heredan características de su padre Clasificación de Objetos En un intento.
1 Definición y Conversión de datos Agustín J. González ELO-329.
TALLER POO JAVA ERNESTO GOMEZ VARGAS. OBJETIVOS REALIZAR UNA APLICACIÓN SENCILLA DE P.O.O FAMILIARIZARSE CON LA HERRAMETA NETBEANS APLICAR EL CONCEPTO.
Algunas Características de C++ no presentes en C Agustín J. González ELO-329.
Herencia en C++ Agustín J. González ELO329. Diseño y Programación Orientados a Objetos 2 Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases.
Prof. Manuel B. Sánchez. Es un mecanismo y uno de los pilares de la POO que permite definir nuevas clases a partir de otras preexistentes. La Herencia.
Programación I Clases. Paradigma POO La programación Orientada a objetos (POO) es una forma programar, más cercana a como expresaríamos las cosas en la.
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Polimorfismo y Funciones Virtuales
Polimorfismo y Métodos Virtuales
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Polimorfismo y Métodos Virtuales
Herencia Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Herencia en C++ Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Herencia en C++ Agustín J. González ELO329.
Agustín J. González Versión original de Kip Irvine ELO329
Polimorfismo en C++ y Métodos Virtuales
Herencia Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Transcripción de la presentación:

1 Herencia Agustín J. González ELO329

2 Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases que tienen algo en común.

Motor ElectricMotor Motor y ElectricMotor Un objeto ElectricMotor contiene el mismo número de identificación (ID) como un Motor, más el voltaje.

4 class CMotor { public: CMotor() { } CMotor( const string & id ); string get_ID() const; void set_ID(const string & s); void Display() const; void Input(); private: string m_sID; }; // más... Clase CMotor Definición de la clase CMotor:

5 CMotor::CMotor( const string & id )‏ { set_ID(id); } string CMotor::get_ID() const { return m_sID; } void CMotor::set_ID(const string & s)‏ { m_sID = s; } void CMotor::Display() const { cout << "[CMotor] ID=" << m_sID; } void CMotor::Input()‏ {string temp; cout << "Enter Motor ID: "; cin >> temp; set_ID(temp); }

6 La clase base debe aparecer primero en las declaraciones. Cuando la clase derivada es declarada, ésta menciona a la clase base. Un clase puede derivar de más de una clase base (ojo es una diferencia con JAVA) Creación de Clases Derivadas class base {... }; class derivada : public base {... };

7 Clase CElectricMotor class CElectricMotor : public CMotor { public: CElectricMotor(); CElectricMotor(const string & id, double volts); void Display() const; void Input(); void set_Voltage(double volts); double get_Voltage() const; private: double m_nVoltage; };

8 CElectricMotor::CElectricMotor(const string & id, double volts) : CMotor(id)‏ { m_nVoltage = volts; } Un inicializador de clase base llama al constructor de la clase base. En este ejemplo, el número ID del motor es pasado al constructor de CMotor. Inicializador de Clase Base

9 La función Input existe en ambas clases CMotor y CElectricMotor. En lugar de duplicar el código ya escrito, se llama al método correspondiente en la clase base: Llamando a métodos de la clase base void CElectricMotor::Input()‏ { CMotor::Input(); // llamamos a la clase base primero // En java lo hacíamos con super.Input()‏ double volts; cout << "Voltage: "; cin >> volts; set_Voltage(volts); }

10 Esta es la función Input en la clase CMotor: Llamado de Métodos de la clase Base void CMotor::Input()‏ { string temp; cout << "Enter Motor ID: "; cin >> temp; set_ID(temp); }

11 La función Display funciona de la misma manera. Ésta llama a CMotor::Display primero. Función o método de Despliegue void CElectricMotor::Display() const { // call base class function first CMotor::Display(); cout << " [CElectricMotor]" << " Voltage=" << m_nVoltage << endl; }

12 Un programa de prueba puede crear instancias de ambas clases CMotor y CElectricMotor. Probando las Clases CMotor mot("33333"); mot.Display(); cout << endl; CElectricMotor elec("40000",220.0); elec.Display(); cout << endl;

13 Cuando usamos instancias de clases derivadas de otra, podemos llamar a funciones de la clase base y la derivada. Igual que en Java. Probando Clases CElectricMotor elec; // CElectricMotor elec.set_ID("40000"); // CMotor elec.set_Voltage(220.0); // CElectricMotor

14 Cuando el mismo nombre de método existe en ambas clases, C++ llama al método implementado para la clase según la declaración del objeto. Éste es el caso con los métodos Input y Display: Probando Clases CElectricMotor elec; // CelectricMotor elec.Input(); // CElectricMotor elec.Display(); // CElectricMotor

15 Podemos asignar objetos de clases derivadas a un objeto de la clase base. Igual que en Java Asignación de Objetos CMotor mot; CElectricMotor elec; mot = elec; // se copian sólo los atributos de Motor elec.get_Voltage(); // ok mot.get_Voltage(); // error, no es motor eléctrico

16 Pero no podemos asignar una instancia de una clase base a una instancia de una clase derivada (igual que en Java). Ello permitiría referencias a miembros no existentes. Asignación de Objetos CMotor mot; CElectricMotor elec; elec = mot; // error elec.set_Voltage( 220 ); // ???

17 Acceso a miembros Protected (Protegidos)‏ Miembros de una clase designados como protected son visibles a ambos la clase actual y las clases derivadas. (y a clases amigas -friend- pero a nadie más)‏

18 Aquí hay un ejemplo que usa el calificador protected para limitar la visibilidad de get_ID y set_ID: Clases con miembros Protected class CMotor { public: CMotor() { } CMotor( const string & id ); protected: string get_ID() const; void set_ID(const string & s); //...

19 El programa principal no puede llamar set_ID y get_ID porque ellos están protegidos: Acceso a miembros Protected CMotor M; M.set_ID("12345"); // error M.get_ID(); // error

20 Pero funciones en CElectricMotor sí pueden acceder set_ID: Acceso a miembros Protected CElectricMotor::CElectricMotor(const string & id, double volts)‏ { m_nVoltage = volts; set_ID(id); }

21 Supongamos por un momento que CMotor usa miembros públicos para todos sus métodos: Herencia Protegida class CMotor { public: CMotor() { } CMotor( const string & id ); string get_ID() const; void set_ID(const string & s); //...

22 Podemos usar el calificador protected cuando creemos una clase derivada. Todos los métodos públicos en la clase base pasan a ser protegidos en la clase derivada. Herencia Protegida class CElectricMotor : protected CMotor { //... };

23 Por ejemplo, el programa principal no puede llamar set_ID y get_ID en un motor eléctrico porque los métodos no son públicos en esta clase: Herencia Protegida CElectricMotor EM; EM.set_ID("12345"); // error EM.get_ID(); // error

24 Puede ser que el autor de la clase CElectricMotor no quiera dar a conocer el número ID del motor. Métodos en CElectricMotor sí pueden acceder métodos públicos en CMotor que serán privadas para otros. Un ejemplo: Herencia Protegida CElectricMotor::CElectricMotor( const string & id, double volts)‏ { m_nVoltage = volts; set_ID(id); }

25 La herencia privada causa que todos los métodos declarados en la clase base sean privados en la clase derivada. Pareciera que no hay diferencia con herencia protegida: Funciones en CElectricMotor pueden acceder funciones miembros en CMotor... Herencia Privada class CElectricMotor : private CMotor { //... };

26 Pero cuando derivamos una nueva clase (CPumpMotor) de CElectricMotor, la diferencia se hace notar: métodos en CPumpMotor no pueden acceder miembros públicos de CMotor. Herencia Privada class CPumpMotor : public CElectricMotor { public: void Display() { CMotor::Display(); // not accessible! CElectricMotor::Display(); // this is OK } };