Herencia en C Agustn J Gonzlez ELO 329

  • Slides: 20
Download presentation
Herencia en C++ Agustín J. González ELO 329

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

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

Motor y Electric. Motor Consideremos dos clases que tienen algo en común. Motor Electric. Motor Diseño y Programación Orientados a Objetos 2

Motor y Electric. Motor Un objeto Electric. Motor contiene el mismo número de identificación

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

Clase CMotor Definición de la clase CMotor: En CMotor. h class CMotor { No

Clase CMotor Definición de la clase CMotor: En CMotor. h class CMotor { No se repite en cada miembro. Si se omite en private public: CMotor() { } CMotor( const string & id ); string get_ID() const; void set_ID(const string & s); void Display() const; void Input(); private: string m_s. ID; }; // más. . . Diseño y Programación Orientados a Objetos 4

CMotor: : CMotor( const string & id ) { set_ID(id); } string CMotor: :

CMotor: : CMotor( const string & id ) { set_ID(id); } string CMotor: : get_ID() const { return m_s. ID; } void CMotor: : set_ID(const string & s) En CMotor. cpp { m_s. ID = s; } void CMotor: : Display() const { cout << "[CMotor] ID=" << m_s. ID; } void CMotor: : Input() { string temp; cout << "Enter Motor ID: "; cin >> temp; set_ID(temp); } Diseño y Programación Orientados a Objetos 5

Creación de Clases Derivadas class base {. . . }; La clase base debe

Creación de Clases Derivadas class base {. . . }; La clase base debe aparecer primero en las declaraciones. Típicamente vía un “base. h” class derivada : public base {. . . }; 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 6

Clase CElectric. Motor class CElectric. Motor : public CMotor { public: CElectric. Motor(); CElectric.

Clase CElectric. Motor class CElectric. Motor : public CMotor { public: CElectric. Motor(); CElectric. Motor(const string & id, double volts); void Display() const; void Input(); void set_Voltage(double volts); double get_Voltage() const; Diseño y Programación Orientados a Objetos private: 7

Inicializador de Clase Base Para inicializar los atributos definidos en la clase base se

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. CElectric. Motor: : CElectric. Motor(const string & id, double volts) : CMotor(id) { m_n. Voltage = volts; } Diseño y Programación Orientados a Objetos 8

Llamando a métodos de la clase base void CElectric. Motor: : Input() { CMotor:

Llamando a métodos de la clase base void CElectric. Motor: : 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 CElectric. Motor. 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 9

Función o método de Despliegue La función Display funciona de la misma manera. Ésta

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

Probando Clases Cuando el mismo nombre de método existe en ambas clases, C++ llama

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): CElectric. Motor elec; elec. Input(); elec. Display(); // Celectric. Motor // CElectric. Motor Diseño y Programación Orientados a Objetos 11

Asignación de Objetos Podemos asignar objetos de clases derivadas a un objeto de la

Asignación de Objetos Podemos asignar objetos de clases derivadas a un objeto de la clase base. Igual que en Java CMotor mot; CElectric. Motor 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 12

Asignación de Objetos Pero no podemos asignar una instancia de una clase base a

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

Acceso a miembros Protected (Protegidos) Miembros de una clase designados como protected son visibles

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 14

Herencia Protegida Supongamos por un momento que CMotor usa miembros públicos para todos sus

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 15

Herencia Protegida Podemos usar el calificador protected cuando creemos una clase derivada. Todos los

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 CElectric. Motor : protected CMotor { //. . . }; Diseño y Programación Orientados a Objetos 16

Herencia Protegida Por ejemplo, el programa principal no puede llamar set_ID y get_ID en

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

Herencia Privada La herencia privada causa que todos los métodos declarados en la clase

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 CElectric. Motor pueden acceder funciones miembros en CMotor. . . class CElectric. Motor : private CMotor { //. . . }; Diseño y Programación Orientados a Objetos 18

Herencia Privada Pero cuando derivamos una nueva clase (CPump. Motor) de CElectric. Motor, la

Herencia Privada Pero cuando derivamos una nueva clase (CPump. Motor) de CElectric. Motor, la diferencia se hace notar: métodos en CPump. Motor no pueden acceder miembros públicos de CMotor. class CPump. Motor : public CElectric. Motor { public: void Display() { CMotor: : Display(); // not accessible! CElectric. Motor: : Display(); // this is OK } }; Diseño y Programación Orientados a Objetos 19

Miembros que no son heredados El constructor y destructor de la clase base no

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 20