Herencia en C++ Agustín J. González ELO329.

Slides:



Advertisements
Presentaciones similares
1 Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
Advertisements

1 Polimorfismo y Funciones Virtuales Agustín J. González ELO329.
1 Herencia Agustín J. González ELO Motor ElectricMotor Motor y ElectricMotor Consideremos dos clases que tienen algo en común.
1 Herencia Agustín J. González Versión original de Kip Irvine ELO320: Seminario II 2do. Sem 2001.
1 Polimorfismo y Funciones Virtuales Agustín J. González Versión original de Kip Irvine ELO329.
Polimorfismo y Métodos Virtuales Agustín J. González ELO329.
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.
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.
PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento y constructores.
PROGRAMACIÓN ORIENTADA A OBJETOS SEGUNDA UNIDAD: “CLASES, OBJETOS Y MÉTODOS” IRVING YAIR SALAS CHÁVEZ ING. EN SISTEMAS COMPUTACIONALES - ITSLP.
PROGRAMACIÓN ORIENTADA A OBJETOS
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Clases en C++ Agustín J. González ELO329.
Polimorfismo y Funciones Virtuales
Clases en C++ Agustín J. González ELO329.
Algunas Características de C++ no presentes en C
Polimorfismo y Métodos Virtuales
Manejo de Punteros y objetos en memoria dinámica en C++
Algunas Características de C++ no presentes en C
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Clases en C++ Agustín J. González ELO329.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Manejo de Excepciones Agustín J. González ELO329.
Vectors (Vectores)‏ e Iteradores
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Asignación Dinámica de Memoria
Algunas Características de C++ no presentes en C
Manejo de Punteros y objetos en memoria dinámica en C++
Polimorfismo y Métodos Virtuales
Definición y Conversión de datos
Herencia Agustín J. González ELO329.
Herencia en C#.
Clases en C++ Agustín J. González ELO329.
Manejo de Excepciones Agustín J. González ELO329.
Vectors (Vectores)‏ e Iteradores
Plantillas (Templates)‏
Algunas Características de C++ no presentes en C
Manejo de Excepciones Agustín J. González ELO329.
Manejo de Excepciones Agustín J. González ELO329.
Manejo de Punteros y objetos en memoria dinámica en C++
Programación Orientada a Objetos
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Algunas ideas básicas de C++
Herencia en C++ Agustín J. González ELO329.
Tópicos Avanzados de Programación (TAP3501)
Clases en C++ Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Vectors (Vectores)‏ Agustín J. González ELO329.
Algunas Características de C++ no presentes en C
Templates (en español: Pantillas, modelos, patrones)‏
Manejo de Excepciones en C++
Manejo de Punteros y objetos en memoria dinámica en C++
Clases en C++ Agustín J. González ELO329.
Polimorfismo en C++, ligado dinámico y Métodos Virtuales
Manejo de Excepciones en C++
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.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Agustín J. González Versión original de Kip Irvine ELO329
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Algunas Características de C++ no presentes en C
Polimorfismo en C++ y Métodos Virtuales
Templates (en español: Pantillas, modelos, patrones)‏
Tema 5 H erencia. La herencia es una forma de reutilización de software en la que las clases se crean incorporando los datos (atributos) y el comportamiento.
Herencia Agustín J. González ELO329.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
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 Motor y ElectricMotor Consideremos dos clases que tienen algo en común. Motor ElectricMotor Diseño y Programación Orientados a Objetos

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

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

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

Creación de Clases Derivadas class base { ... }; class derivada : public base { La clase base debe aparecer primero en las declaraciones. Típicamente vía un “base.h” Nivel de acceso, puede ser: public, protected, private u omitido. Un clase puede derivar de más de una clase base (ojo es una diferencia con JAVA) Diseño y Programación Orientados a Objetos

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

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

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

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

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

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

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

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

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

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

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

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

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

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