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.

Slides:



Advertisements
Presentaciones similares
Programación orientada a objetos en Visual Basic .NET
Advertisements

Clases en C++.
Herencia en C#.
Lenguaje de programación Java
Herencia y Polimorfismo
Encapsulamiento y Abstracción
HERENCIA.
Lenguaje de Programación Java Profesor: Mauricio Martínez P. Análisis y Diseño Orientado a Objetos UML: Lenguaje de Modelamiento Unificado Toma de Requerimientos.
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.
Lic. Rosemary Torrico Bascopé
Introducción a clases Programación Orientada a Objetos.
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.
 2003 Prentice Hall, Inc. All rights reserved. 1 Capítulo 6: Clases y Abstracción de Datos Índice del capítulo 6.1 Introducción 6.2 Estructuras 6.3 Clases.
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.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
Programación Orientada a Objetos usando CONSTRUCTORES DESTRUCTORES.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
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++
Módulo 7: Programación Orientada a Objetos en Visual Basic 2005.
UNIDAD VI Recursos esenciales de Java LSC. Natalia Rodríguez Castellón.
1 Herencia Agustín J. González ELO Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases que tienen algo en común.
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.
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 Miembros Estáticos (Static) de Clases y Funciones Amigas (Friend)‏ Agustín J. González ELO329.
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.
Algunas Características de C++ no presentes en C Agustín J. González ELO-329.
Programación orientada a objetos La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que 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:

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 que tienen algo en común.

Diseño y Programación Orientados a Objetos Motor ElectricMotor Motor y ElectricMotor Un objeto ElectricMotor contiene el mismo número de identificación (ID) como un Motor, más el voltaje.

Diseño y Programación Orientados a Objetos 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: En CMotor.h No se repite en cada miembro. Si se omite en private

Diseño y Programación Orientados a Objetos 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); } En CMotor.cpp

Diseño y Programación Orientados a Objetos 6 La clase base debe aparecer primero en las declaraciones. Típicamente vía un “base.h” 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 {... }; Nivel de acceso, puede ser: public, protected, private u omitido.

Diseño y Programación Orientados a Objetos 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; };

Diseño y Programación Orientados a Objetos 8 Para inicializar los atributos definidos en la clase base se llama al constructor de la clase base. En este ejemplo, el número ID del motor es pasado al constructor de CMotor. CElectricMotor::CElectricMotor(const string & id, double volts) : CMotor(id)‏ { m_nVoltage = volts; } Inicializador de Clase Base

Diseño y Programación Orientados a Objetos 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); }

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

Diseño y Programación Orientados a Objetos 11 Probando Clases 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 (es lo esperable): CElectricMotor elec; // CelectricMotor elec.Input(); // CElectricMotor elec.Display(); // CElectricMotor

Diseño y Programación Orientados a Objetos 12 Asignación de Objetos Podemos asignar objetos de clases derivadas a un objeto de la clase base. Igual que en Java 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

Diseño y Programación Orientados a Objetos 13 Asignación de Objetos 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. CMotor mot; CElectricMotor elec; elec = mot; // error, No se permite. // pues el voltaje queda indefinido.

Diseño y Programación Orientados a Objetos 14 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). Son análogos a Java. class CMotor { public: CMotor() { } CMotor( const string & id ); protected: string get_ID() const; void set_ID(const string & s); //...‏ }

Diseño y Programación Orientados a Objetos 15 Herencia Protegida Supongamos por un momento que CMotor usa miembros públicos para todos sus métodos: class CMotor { public: CMotor() { } CMotor( const string & id ); string get_ID() const; void set_ID(const string & s); //... }

Diseño y Programación Orientados a Objetos 16 Herencia Protegida 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. Los restantes mantienen su nivel de restricción. class CElectricMotor : protected CMotor { //... };

Diseño y Programación Orientados a Objetos 17 Herencia Protegida 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: CElectricMotor EM; EM.set_ID("12345"); // error EM.get_ID(); // error

Diseño y Programación Orientados a Objetos 18 Herencia Privada 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... class CElectricMotor : private CMotor { //... };

Diseño y Programación Orientados a Objetos 19 Herencia Privada 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. class CPumpMotor : public CElectricMotor { public: void Display() { CMotor::Display(); // not accessible! CElectricMotor::Display(); // this is OK } };

Diseño y Programación Orientados a Objetos 20 Miembros que no son heredados El constructor y destructor de la clase base no son heredados, deben ser definidos en la clase heredada. El constructor por omisión y el destructor sí son llamados cuando se crea o destruye una instancia de la clase derivada. Si la clase base tiene sobrecargado el operador =, éste no se hereda en la clase derivada. La relación de “amistad” no se hereda. Las clases y funciones friend no son friend en la clase heredada. Si se omite el nivel de acceso, equivale a poner private cuando la clase es declara con class y public si usamos struct.