Herencia Agustn J Gonzlez ELO 329 1 Clasificacin

  • Slides: 36
Download presentation
Herencia Agustín J. González ELO 329 1

Herencia Agustín J. González ELO 329 1

Clasificación de Objetos n En un intento en modelar el mundo real los diseñadores

Clasificación de Objetos n En un intento en modelar el mundo real los diseñadores clasifican los objetos. Herencia implica una relación en la cual ciertas características son heredadas. padre hijo Como en biología, los niños heredan características de su padre 2

Tipos de Motores n Claramente todos estos casos están relacionados. ¿Qué podrían todos estos

Tipos de Motores n Claramente todos estos casos están relacionados. ¿Qué podrían todos estos motores tener en común? Solar Electric Wind Steam Gasoline Diesel 3

Motores n La información común puede ser descrita en una clase base llamada Motor:

Motores n La información común puede ser descrita en una clase base llamada Motor: Motor class: Serial number Manufacturer Date of Manufacture Model Number etc. 4

Relación de Herencia n Las flechas muestran que las clases Electric. Motor y Gasoline.

Relación de Herencia n Las flechas muestran que las clases Electric. Motor y Gasoline. Motor son clases derivadas de la clase Motor Es un Electric. Motor Gasoline. Motor 5

Relación de Herencia. . . n Muchas otras clases tienen esta relación, tales como

Relación de Herencia. . . n Muchas otras clases tienen esta relación, tales como las clases istream (flujo de entrada) y ifstream (flujo de entrada de archivo). istream Deriva de ifstream 6

Ejemplo: Empleados n Podríamos clasificar empleados basados en cómo se les paga. . .

Ejemplo: Empleados n Podríamos clasificar empleados basados en cómo se les paga. . . Employee Salaried Employee Hourly Employee Commission Employee 7

Tipos de Empleados n . . . o podríamos clasificarlos basados en su estatus:

Tipos de Empleados n . . . o podríamos clasificarlos basados en su estatus: Employee Full-time Part-time Temporary 8

Relaciones de Herencia. . . n Algunas relaciones son un tanto remotas. . Vehicle

Relaciones de Herencia. . . n Algunas relaciones son un tanto remotas. . Vehicle Dune Buggy Motor. Cycle 9

Relaciones de herencia. . . n Otras son muy específicas: Passenger. Vehicle Sport. Utility

Relaciones de herencia. . . n Otras son muy específicas: Passenger. Vehicle Sport. Utility Mini. Van 10

Múltiples Niveles son posible Vehicle Commercial. Vehicle Passenger. Vehicle Bus Taxicab Cargo. Vehicle Flatbed.

Múltiples Niveles son posible Vehicle Commercial. Vehicle Passenger. Vehicle Bus Taxicab Cargo. Vehicle Flatbed. Truck Fork. Lift 11

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

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

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

Motor y Electric. Motor n 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 13

Clase CMotor n Definición de la clase CMotor: class CMotor { public: CMotor() {

Clase CMotor n Definición de la clase CMotor: 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_s. ID; }; // más. . . 14

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) { 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); } 15

Creación de Clases Derivadas La clase base debe aparecer primero en las declaraciones. Cuando

Creación de Clases Derivadas La clase base debe aparecer primero en las declaraciones. Cuando la clase derivada es declarada, ésta menciona a la clase base. class base {. . . }; class derived : public base {. . . }; Cualquier número de clases pueden ser derivadas de una misma clase base. Un clase puede derivarse de más de una clase base (ojo no permitido en JAVA) 16

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; private: double m_n. Voltage; }; 17

Inicializador de Clase Base Un inicializador de clase base llama al constructor de la

Inicializador de Clase Base 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. CElectric. Motor: : CElectric. Motor(const string & id, double volts) : CMotor(id) { m_n. Voltage = volts; } 18

Llamando a métodos de la clase base La función Input existe en ambas clases

Llamando a métodos de la clase base 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: void CElectric. Motor: : Input() { CMotor: : Input(); // call base class first double volts; cout << "Voltage: "; cin >> volts; set_Voltage(volts); } 19

Llamado de Métodos de la clase Base Esta es la función Input en la

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

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; } 21

Probando las Clases Un programa de prueba puede crear instancias de ambas clases CMotor

Probando las Clases Un programa de prueba puede crear instancias de ambas clases CMotor y CElectric. Motor. CMotor mot("33333"); mot. Display(); cout << endl; CElectric. Motor elec("40000", 220. 0); elec. Display(); cout << endl; 22

Probando Clases Cuando usamos instancias de clases derivadas de otra, podemos llamar a funciones

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

Probando Clases Cuando el mismo nombre de función existe en ambas clases, C++ automáticamente

Probando Clases Cuando el mismo nombre de función existe en ambas clases, C++ automáticamente llama la función implementada para la clase derivada. Éste es el caso con las funciones Input y Display: elec. Input(); // CElectric. Motor elec. Display(); // CElectric. Motor 24

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. Esto es llamado rebanado de objeto (object slicing). Igual que en Java CMotor mot; CElectric. Motor elec; mot = elec; // sliced down to a motor elec. get_Voltage(); // ok mot. get_Voltage(); // error 25

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; elec. set_Voltage( 220 ); // error // ? ? ? 26

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

Acceso a miembros Protected (Protegidos) n 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) 27

Clases con miembros Protected Aquí hay un ejemplo que usa el calificador protected para

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

Acceso a miembros Protected El programa principal no puede llamar set_ID y get_ID porque

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

Acceso a miembros Protected Pero funciones en CElectric. Motor sí pueden acceder set_ID: CElectric.

Acceso a miembros Protected Pero funciones en CElectric. Motor sí pueden acceder set_ID: CElectric. Motor: : CElectric. Motor( const string & id, double volts) { m_n. Voltage = volts; set_ID(id); } 30

Herencia Protegida Supongamos por un momento que Cmotor usa miembros públicos para todas sus

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

Herencia Protegida Podemos usar el calificador protected cuando creemos una clase derivada. Todas las

Herencia Protegida Podemos usar el calificador protected cuando creemos una clase derivada. Todas las funciones públicas en la clase base pasan a ser protegidas en la clase derivada. class CElectric. Motor : protected CMotor { //. . . }; 32

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 las funciones no son públicas en esta clase: CElectric. Motor EM; EM. set_ID("12345"); // error EM. get_ID(); // error 33

Herencia Protegida Puede ser que el autor de la clase CElectric. Motor no quiera

Herencia Protegida Puede ser que el autor de la clase CElectric. Motor no quiera dar a conocer el número ID del motor. Funciones en CElectric. Motor sí pueden acceder funciones públicas en CMotor. Un ejemplo: CElectric. Motor: : CElectric. Motor( const string & id, double volts) { m_n. Voltage = volts; set_ID(id); } 34

Herencia Privada La herencia privada causa que todas las funciones declaradas en la clase

Herencia Privada La herencia privada causa que todas las funciones declaradas en la clase base sean privadas 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 { //. . . }; 35

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: funciones 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 } }; 36