sesión 11: herencia (1) – herencia simple 1. 2009/1 circuitos digitales iii 2010/1 circuitos...

50
Informática II Sesión 11: Herencia (1) – herencia simple 1

Upload: oscar-fuentes-figueroa

Post on 02-Feb-2016

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

1

Informática IISesión 11: Herencia (1) – herencia simple

Page 2: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONTENIDOCONTENIDO

2

Herencia1

Redefinición de métodos2

3 Métodos ocultos

Funciones Virtuales4

Page 3: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

HERENCIAHERENCIA

Diferentes tipos de objetos usualmente comparten características similares entre

sí.

La herencia permite generar nuevas clases tomando como base otra clase ya

implementada.

También hace posible la implementación de jerarquías desde la generalización hasta la

especialización de los objetos.

3

Page 4: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

HERENCIAHERENCIALa POO permite a las clases heredar las características y los comportamientos de

otras clases

Adicionalmente C++, permite definir una clase modificando una o más clases ya existentes.

Estas modificaciones consisten habitualmente en añadir nuevos miembros a

la nueva clase

4

Page 5: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

HERENCIAHERENCIA La clase de la que se parte en este proceso

recibe el nombre de clase base, y la nueva clase que se obtiene se denomina clase derivada.

Esta clase derivada a su vez puede ser clase base en un nuevo proceso de derivación, iniciando de esta manera una jerarquía de clases.

Page 6: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

DECLARACIÓN DE HERENCIA

DECLARACIÓN DE HERENCIA Cuando se declara una clase, es posible indicar

de donde va a heredar sus características, y se declara de la siguiente manera:

class claseDerivada : tipoDeAcceso claseBase

Ejemplo:

class perro : public animal {

…….

};

// Se genera la clase perro a partir de la clase animal

6

Page 7: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

NOTAS:NOTAS:

1

•Primero se debe crear la clase base, antes de tratar de crear clases que deriven de esta.

2

•El número de variables miembro de una clase derivada es mayor o igual que el de la clase base.

3

•Hay algunos elementos de la clase base que no pueden ser heredados:•Constructore

s y destructores

•Funciones friend

•Métodos y atributos estáticos de la clase

•Operador de asignación (=) sobrecargado

7

Page 8: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

HerenciaHerencia

8

MODIFICADORES DE ACCESO

Page 9: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Modificadores de AccesoModificadores de Acceso Para controlar la transmisión de la accesibilidad

se utiliza el tipoDeAcceso.

class claseDerivada : tipoDeAcceso claseBase

Este especificador puede ser cualquiera de las palabras clave ya conocidas: private, public, protected .

9

Page 10: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Son accesibles desde el exterior de la clase; pueden ser referenciados desde cualquier sitio donde la clase sea visible y constituyen en realidad su interfaz.

Los atributos y métodos públicos son accesibles por los usuarios de la clase.

10

Público (public)Público (public)

Page 11: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Ejemplo:

class B : public A { ... };

miembros públicos en A resultan públicos en B.

miembros protegidos en A resultan protegidos en B.

miembros privados en A “no se heredan”.

11

Público (public)Público (public)

Page 12: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Solo son accesibles por miembros de la propia clase; no desde el exterior.

Suele decirse de ellos que solo son accesibles por el implementador de la clase.

Cuando se deriva de una clase, los miembros privados “no son accesibles” en la clase derivada.

12

PRIVADO (private)PRIVADO (private)

Page 13: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Ejemplo:

class B : private A { ... };

miembros públicos en A resultan privados en B.

miembros protegidos en A resultan privados en B.

miembros privados en A “no se heredan”.

13

PRIVADO (private)PRIVADO (private)

Page 14: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Tienen el mismo comportamiento que los privados, pero difieren en cuanto a la accesibilidad de sus descendientes.

Los miembros de clases derivadas que son descendientes de miembros protegidos, son accesibles por el resto de los miembros (cosa que no ocurre con los descendientes de miembros privados)

14

Protegido (protected)Protegido (protected)

Page 15: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Ejemplo:

class B : protected A { ... };

miembros públicos en A resultan protegidos en B.

miembros protegidos en A resultan protegidos en B.

miembros privados en A “no se heredan”.

15

Protegido (protected)Protegido (protected)

Page 16: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

MODIFICADORES DE ACCESO

MODIFICADORES DE ACCESO

16

Miembro dela clase base

Tipo de acceso public

Tipo de acceso private

Tipo de acceso protected

Public public private protected

Private “No heredados” “No heredados” “No heredados”

Protected protected private protected

Page 17: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

class bicicleta: protected vehiculo{

private:int Ncambio;int pedalear;int Ndiscos;

public:bicicleta();void cambCambio(int _Ncambio);~bicicleta();

};

EJEMPLO HERENCIAEJEMPLO HERENCIAclass vehiculo{protected:

int vel;bool on;

public:vehiculo();vehiculo(int _vel,bool _on);int getVel() const;void setVel(int _vel);~vehiculo();

};

17

//clase vehiculovehiculo::vehiculo():vel(0),on(false){

cout<<"constructor clase base"<<endl;}

vehiculo::vehiculo(int _vel,bool _on):vel(_vel),on(_on){cout<<"constructor con argumentos clase base"<<endl;

}

int vehiculo::getVel() const {return vel;

}

void vehiculo::setVel(int _vel){vel=_vel;

}

vehiculo::~vehiculo(){}

//clase carrocarro::carro():Ncambio(0),acelerar(0){

cout<<"constructor por defecto clase derivada"<<endl;

}

void carro::cambCambio(int _cambCambio){Ncambio= _cambCambio;

}carro::~carro(){}

class carro: public vehiculo{private:

int Ncambio;int acelerar;

public:carro();void cambCambio(int _Ncambio);~carro();

};

using namespace std;

carro audi;

int main(){

//damos un valor a una variable miembro heredadaaudi.setVel(10);//accedemos a un metodo heredadocout<<audi.getVel()<<endl;

return 0;}

audi vel: 10

Page 18: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Cuando un objeto derivado es creado primero es llamado el constructor de la clase base y luego el propio.

18

int vel;

bool on;

int Ncambio;

int acelerar;

Parte vehículo

Objeto carro

CONSTRUCTORES Y DESTRUCTORES

CONSTRUCTORES Y DESTRUCTORES

Page 19: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Se pueden inicializar las variables miembro heredadas, llamando al constructor de la clase base desde la etapa de inicialización del constructor de la clase derivada así:

19

carro(int _vel,bool _on);carro::carro(int _vel,bool _on):

Ncambio(0), acelerar(0){ }

vehiculo(_vel,_on),

PASAR ARGUMENTOS AL CONSTRUCTOR BASE

PASAR ARGUMENTOS AL CONSTRUCTOR BASE

Page 20: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Crear: Clase base: persona Clases derivadas: estudiante, profesor, empleado.

• Los modificadores de acceso deben ser publico, privado y protegido respectivamente.

Cada clase debe tener por lo menos 2 constructores (por defecto y sobrecargado)

20

EJEMPLOEJEMPLO

Page 21: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONTENIDOCONTENIDO

21

Herencia1

Redefinición de métodos2

3 Métodos ocultos

Funciones Virtuales4

Page 22: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

REDEFINICIÓN DE MÉTODOSREDEFINICIÓN DE MÉTODOS Es posible que una clase derivada “sobreescriba” el

funcionamiento de un método de su clase base, basta con redefinir nuevamente dicho método en la clase derivada.

Para poder “sobreescribir ” un método es necesario que las firmas de ambas clases sean iguales

Nota: Firma = a todo lo declarado en el prototipo de las funciones (incluyendo const) a excepción de su variable de retorno.

22

int getVel() const;

FirmaArgumento de retorno

Page 23: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLO REDEFINICIÓN DE MÉTODOS

EJEMPLO REDEFINICIÓN DE MÉTODOS

23

class Vehiculo{protected:

int vel;bool on;

public:Vehiculo();Vehiculo(int _vel,bool _on);int getVel() const;void setVel(int _vel);~Vehiculo();

};

class Carro: public Vehiculo{private:

int Ncambio;int acelerar;

public:Carro();Carro(int _vel,bool _on);int getVel() const;void cambCambio(int _Ncambio);~Carro();

};

int vehiculo::getVel() const {cout<<"funcion getVel clase base"<<endl;return vel;

}

int carro::getVel() const{cout<<"funcion getVel clase derivada"<<endl;return vel;

}int main(){

Carro audi;//damos un valor a una variable miembro heredadaaudi.setVel(10);//accedemos a un método heredado redefinidocout<<audi.getVel()<<endl;//acedemos al metodo de la clase basecout<<audi.vehiculo::getVel()<<endl;

return 0;}

Page 24: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

SOBRECARGAR VS REDEFINIR

SOBRECARGAR VS REDEFINIR

Cuando se sobrecarga

funciones, el nombre de la función

permanece, pero los argumentos de

entrada y de retorno pueden variar, al igual

que la implementación.

Cuando se redefine una función lo único que cambia es su

implementación. El encabezado

permanece igual (argumento de retorno

y firma) en la clase base como en la

derivada.

24

Page 25: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONTENIDOCONTENIDO

25

Herencia1

Redefinición de métodos2

3 Métodos ocultos

Funciones Virtuales4

Page 26: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

OCULTANDO LOS MÉTODOS DE LA CLASE BASE

OCULTANDO LOS MÉTODOS DE LA CLASE BASE

Si la clase base contiene varios métodos sobrecargados, y

redefinimos uno de esos métodos dentro de una clase derivada, todos los métodos dentro de la clase base que respondan al mismo nombre

quedaran ocultos, es decir no se podrán acceder a través

del objeto derivado.

26

Page 27: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLO

27

class vehiculo{protected:

int vel;bool on;

public:vehiculo();vehiculo(vehiculo &V);vehiculo(int _vel,bool _on);void setVel(int _vel);int getVel() const;//sobrecarga metodo getVelint getVel(float other);int getVel(int other);virtual vehiculo* clonar();virtual ~vehiculo();

};

class carro: public vehiculo{private:

int Ncambio;int acelerar;

public:carro();carro(int _vel,bool _on);int getVel() const;void cambCambio(int _Ncambio);~carro();

};

carro audi(10,true);

int main(){

int a=5;float b=45.6;//solo podemos acceder a el método heredado redefinidoaudi.getVel();

audi.getVel(a);//para haceder a los demás métodos sobrecargadosaudi.vehiculo::getVel();audi.vehiculo::getVel(a);audi.vehiculo::getVel(b);return 0;

}

Page 28: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Cuando se redefine un método sobrecargado, todas sus variaciones se ocultan. Si no se desea que se oculten, entonces se debe redefinir cada una de las variaciones o sobrecargas en la clase derivada.

OCULTANDO LOS MÉTODOS DE LA CLASE BASE

OCULTANDO LOS MÉTODOS DE LA CLASE BASE

Page 29: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

1 •Es posible realizar conversiones o asignaciones de un objeto de una clase derivada a un objeto de la clase base.

2 •Es decir se puede ir de lo más particular a lo más general, aunque en esa operación se pierda información, pues haya variables que no tengan a qué asignarse

3 •Por el contrario las conversiones o asignaciones en el otro sentido, es decir de lo más general a lo más particular, no son posibles, porque puede suceder que no se disponga de valores para todas las variables miembro de la clase derivada.

29

Page 30: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

30

Objeto_claseBase= Objeto_claseDerivada;

Objeto_claseDerivada= Objeto_claseBase;

Se puede hacer referencia a un objeto de la clase derivada con su dirección contenida en un puntero a la clase base.

vehiculo *ptrV=new carro(30,true);

carro *ptrC=new vehiculo();

Page 31: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

CONVERSIONES ENTRE CLASE BASE Y DERIVADA

31

using namespace std;

int main(){

vehiculo *ptrV=new carro(30,true);

cout<< ptrV->getVel()<<endl;//se accede al metodo de la clase basereturn 0;

}

Page 32: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONTENIDOCONTENIDO

32

Herencia1

Redefinición de métodos2

3 Métodos ocultos

Funciones Virtuales4

Page 33: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

MÉTODOS VIRTUALESMÉTODOS VIRTUALES

Tenemos un problema cuando deseamos acceder al método de la clase derivada a través de un puntero de tipo clase base. Para lograrlo debemos definir el método como virtual dentro de la clase base.

Para declarar una función como virtual basta

con adicionar la palabra “virtual” al inicio de su prototipo.

33

virtual par_retorno nombreMetodo(parámetros entrada );

Page 34: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLO MÉTODOS VIRTUALES

EJEMPLO MÉTODOS VIRTUALES

34

class vehiculo{protected:

int vel;bool on;

public:vehiculo();vehiculo(int _vel,bool _on);virtual int getVel() const;void setVel(int _vel);~vehiculo();

};

class carro: public vehiculo{private:

int Ncambio;int acelerar;

public:carro();carro(int _vel,bool _on);int getVel() const;void cambCambio(int _Ncambio);~carro();

};

int vehiculo::getVel() const {cout<<"funcion getVel clase base"<<endl;return vel;

}

int carro::getVel() const{cout<<"funcion getVel clase derivada"<<endl;return vel;

}

using namespace std;

int main(){

vehiculo *ptrV=new carro(30,true);cout<<ptrV->getVel()<<endl;

//se accede al método de la clase derivadareturn 0;

}

Page 35: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

MÉTODOS VIRTUALESMÉTODOS VIRTUALES

Una vez que un método es declarado como virtual, lo seguirá siendo en las clases derivadas, es decir, la propiedad virtual se hereda

35

Trabajando con punteros clase base

Page 36: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

MÉTODOS VIRTUALESMÉTODOS VIRTUALES Cuando se aplica a métodos de clase, el

especificador virtual debe ser utilizado en la declaración, pero no en la definición

36

class A {  ...  virtual void func1();  virtual void func2();  virtual void func3() { ... }    // Ok. definición inline};virtual void A::func1() { ... }   // Error!!void A::func2() { ... }          // Ok. definición offline

Page 37: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

MÉTODOS VIRTUALESMÉTODOS VIRTUALES

Por cada clase que utiliza métodos virtuales, se genera una tabla por parte del compilador denominada v-table, que contiene la información de cada uno de los métodos definidos como virtuales.

Cada objeto creado de una clase que tenga un método virtual, contiene un puntero oculto a la v-table de su clase. Mediante ese puntero accede a su v-table correspondiente y a través de esta tabla accede a la definición adecuada del método virtual.

En el caso de que en esa clase no esté definido el método virtual en cuestión, el puntero de v-table apuntará al método virtual de su clase base más próxima en la jerarquía, que tenga una definición propia de la función virtual.

37

Page 38: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

MÉTODOS VIRTUALESMÉTODOS VIRTUALES

Esto quiere decir que buscará primero en la propia clase, luego en la clase anterior en el orden jerárquico y se irá subiendo en ese orden hasta dar con una clase que tenga definido el método buscado.

Cuando el compilador llama el método virtual de la clase base, en vez del método de la case derivada, se dice que se presento un “Data Slicing”.

Las funcionalidades de los métodos virtuales, solo pueden ser usadas cuando se trabaja con punteros o referencias de la clase base.

38

Page 39: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

Métodos VirtualesMétodos Virtuales Las funcionalidad de los métodos virtuales, sólo

pueden ser usadas cuando se trabaja con punteros o referencias de la clase base.

Si a una función se le pasa un objeto por valor se dice que se genera un “slice”, pues no sobrescribirá ninguna de las funciones virtuales descartando así cualquier modificación de las clases derivadas.

39

Page 40: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONSTRUCTORES Y DESTRUCTORES VIRTUALES

CONSTRUCTORES Y DESTRUCTORES VIRTUALES

Cuando se genera al menos un método virtual en la clase base, es indispensable nombrar el destructor como virtual, para garantizar así que primero se llame el destructor de la clase derivada y luego este se encargue de llamar al de la clase base.

Declarar como virtual el destructor de la clase base, hace que automáticamente los destructores de las clases derivadas sean también virtuales, a pesar de tener nombres distintos.

40

Page 41: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

CONSTRUCTORES Y DESTRUCTORES VIRTUALES

CONSTRUCTORES Y DESTRUCTORES VIRTUALES

Los constructores no pueden ser virtuales, lo que se hace es crear funciones “clones” en la clase base para que simulen la llamada de un constructor derivado.

De este modo si es posible declararlo como virtual y redefinirlo en cada clase derivada para que realice una copia exacta del objeto.

41

CONSTRUCTORES COPIA VIRTUALES

Page 42: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia42

ALGUNOS EJEMPLOS

Page 43: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLOclass B {  public: int x;};class D : public B {   public: int y; };

void main() {  B b1;  b1.x =1;  cout << "b1.x = "  << b1.x  << endl;

  D d1;  D d2;                d1.x = 2;    d1.y = 3;    d2.x = 4;  d2.y = 5;  cout << "d1.x = " << d1.x << endl;  cout << "d1.y = " << d1.y << endl;  cout << "d2.x = " << d2.x << endl;  cout << "d2.y = " << d2.y << endl;}

b1.x = 1d1.x = 2d1.y = 3d2.x = 4d2.y = 5

Page 44: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLO#include <typeinfo.h>

class X { public: int x; }; class Y : public X { public: char x; };

class Z : public Y { }; 

void main() {        X mX;  Y mY;   Z mZ;   cout << "mX.x es tipo: " << typeid(mX.x).name() << endl;   cout << "mY.x es tipo: " << typeid(mY.x).name() << endl;   cout << "mZ.x es tipo: " << typeid(mZ.x).name() << endl;}

mX.x es tipo: intmY.x es tipo: charmZ.x es tipo: char

Page 45: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLOusing namespace std;

class B {      public: int fun(int x) {return x * x;} };class D1 : public B {  public:  int fun (int x) {return x + 10;}  };class D2 : public B {   public:  int fun (int x) {return x + 15;}  };

int main(void) {   B b; D1 d1; D2 d2;   cout << "El valor es: " << b.fun(10)     << endl;   cout << "El valor es: " << d1.fun(10)    << endl;   cout << "El valor es: " << d2.fun(10)    << endl;    cout << "El valor es: " << d1.B::fun(10) << endl;   cout << "El valor es: " << d2.B::fun(10) << endl;   return 0;}

El valor es: 100El valor es: 20El valor es: 25El valor es: 100El valor es: 100

Page 46: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLOusing namespace std;

class B {      public: virtual int fun(int x) {return x * x;} };class D1 : public B {  public:  int fun (int x) {return x + 10;}  };class D2 : public B {   public:  int fun (int x) {return x + 15;}  };

int main(void) {   B b; D1 d1; D2 d2;   cout << "El valor es: " << b.fun(10)     << endl;   cout << "El valor es: " << d1.fun(10)    << endl;   cout << "El valor es: " << d2.fun(10)    << endl;    cout << "El valor es: " << d1.B::fun(10) << endl;   cout << "El valor es: " << d2.B::fun(10) << endl;   return 0;}

¿Para qué sirven entonces las funciones virtuales?

El valor es: 100El valor es: 20El valor es: 25El valor es: 100El valor es: 100

Page 47: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLOusing namespace std;

class B {    public: int fun(int x) {return x * x;} };class D1 : public B {   public: int fun (int x) {return x + 10;} };class D2 : public B {    public: int fun (int x) {return x + 15;}  };

int main(void) {  B b; D1 d1; D2 d2;    B* bp = &b; B* bp1 = &d1; B* bp2 = &d2;   D1* d1p = &d1; D2* d2p = &d2;   cout << "El valor es: " << bp->fun(10) << endl;   cout << "El valor es: " << bp1->fun(10) << endl;   cout << "El valor es: " << bp2->fun(10) << endl;   cout << "El valor es: " << d1p->fun(10) << endl;   cout << "El valor es: " << d2p->fun(10) << endl;   return 0;}

El valor es: 100El valor es: 100El valor es: 100El valor es: 20El valor es: 25

Page 48: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLOusing namespace std;

class B {    public: virtual int fun(int x) {return x * x;} };class D1 : public B {   public: int fun (int x) {return x + 10;} };class D2 : public B {    public: int fun (int x) {return x + 15;}  };

int main(void) {  B b; D1 d1; D2 d2;    B* bp = &b; B* bp1 = &d1; B* bp2 = &d2;   D1* d1p = &d1; D2* d2p = &d2;   cout << "El valor es: " << bp->fun(10) << endl;   cout << "El valor es: " << bp1->fun(10) << endl;   cout << "El valor es: " << bp2->fun(10) << endl;   cout << "El valor es: " << d1p->fun(10) << endl;   cout << "El valor es: " << d2p->fun(10) << endl;   return 0;}

El valor es: 100El valor es: 20El valor es: 25El valor es: 20El valor es: 25

Page 49: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

EJEMPLOEJEMPLOusing namespace std;

class B {      public: virtual int fun(int x) {return x * x;} };class D1 : public B {  public:  int fun (int x) {return x + 10;}  };class D2 : public B { 

};

int main(void) {   B b; D1 d1; D2 d2;   cout << "El valor es: " << b.fun(10)     << endl;   cout << "El valor es: " << d1.fun(10)    << endl;   cout << "El valor es: " << d2.fun(10)    << endl;    cout << "El valor es: " << d1.B::fun(10) << endl;   cout << "El valor es: " << d2.B::fun(10) << endl;   return 0;}

El valor es: 100El valor es: 20El valor es: 100El valor es: 100El valor es: 100

Page 50: Sesión 11: Herencia (1) – herencia simple 1. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática

2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia

BibliografíaBibliografía Aprenda C++ Avanzado como si estuviera en

primero. Tecnun. C con clase

http://c.conclase.net/curso/?cap=036#inicio Sams Teach yourselft C++ in 21 days

http://newdata.box.sk/bx/c/htm/ch12.htm

50