La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

1 Sesión 11: Herencia (1) – herencia simple 1

2 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 2 Herencia 1 Redefinición de métodos 2 3 Métodos ocultos Funciones Virtuales 4

3 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia H ERENCIA 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

4 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia H ERENCIA La 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

5 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia H ERENCIA  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.

6 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia D ECLARACIÓN DE H ERENCIA  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

7 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia N OTAS : 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: Constructores y destructores Funciones friend Métodos y atributos estáticos de la clase Operador de asignación (=) sobrecargado 7

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

9 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Modificadores 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

10 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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)

11 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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)

12 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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 P RIVADO (private)

13 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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 P RIVADO (private)

14 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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)

15 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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)

16 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia M ODIFICADORES DE A CCESO 16

17 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia class bicicleta: protected vehiculo{ private: int Ncambio; int pedalear; int Ndiscos; public: bicicleta(); void cambCambio(int _Ncambio); ~bicicleta(); }; E JEMPLO H ERENCIA class vehiculo{ protected: int vel; bool on; public: vehiculo(); vehiculo(int _vel,bool _on); int getVel() const; void setVel(int _vel); ~vehiculo(); }; 17 //clase vehiculo vehiculo::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 carro carro::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 heredada audi.setVel(10); //accedemos a un metodo heredado cout<<audi.getVel()<<endl; return 0; } audi vel: 10

18 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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 vel; bool on; int Ncambio; int acelerar; int Ncambio; int acelerar; Parte vehículo Objeto carro Cuando un objeto es derivado y este se destruye, se llamará primero el destructor de este y posteriormente se llama automáticamente el destructor de la clase base. No es posible crear una clase derivada sin crear primero su porción de la clase base. C ONSTRUCTORES Y D ESTRUCTORES

19 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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), P ASAR ARGUMENTOS AL CONSTRUCTOR BASE

20 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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 E JEMPLO

21 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 21 Herencia 1 Redefinición de métodos 2 3 Métodos ocultos Funciones Virtuales 4

22 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia R EDEFINICIÓ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; Firma Argumento de retorno

23 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO R EDEFINICIÓ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 heredada audi.setVel(10); //accedemos a un método heredado redefinido cout<<audi.getVel()<<endl; //acedemos al metodo de la clase base cout<<audi.vehiculo::getVel()<<endl; return 0; }

24 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia S OBRECARGAR V S R EDEFINIR 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

25 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 25 Herencia 1 Redefinición de métodos 2 3 Métodos ocultos Funciones Virtuales 4

26 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia O CULTANDO LOS M ÉTODOS DE LA C LASE B ASE 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

27 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO 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 getVel int 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 redefinido audi.getVel(); audi.getVel(a); //para haceder a los demás métodos sobrecargados audi.vehiculo::getVel(); audi.vehiculo::getVel(a); audi.vehiculo::getVel(b); return 0; }

28 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informá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. O CULTANDO LOS M ÉTODOS DE LA C LASE B ASE

29 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONVERSIONES ENTRE CLASE B ASE Y D ERIVADA 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

30 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONVERSIONES ENTRE CLASE B ASE Y D ERIVADA 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();

31 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONVERSIONES ENTRE CLASE B ASE Y D ERIVADA En conclusión un puntero a la clase base puede almacenar la dirección de un objeto perteneciente a una clase derivada. Sin embargo, se aplicarán los métodos de la clase a la que pertenezca el puntero (base), no los de la clase a la que pertenece el objeto (derivada). El tipo del puntero utilizado para acceder a un método que se encuentra implementado en ambas clases (base y derivada), determinará cuál de los dos métodos llamar. 31 using namespace std; int main() { vehiculo *ptrV=new carro(30,true); cout getVel()<<endl; //se accede al metodo de la clase base return 0; }

32 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONTENIDO 32 Herencia 1 Redefinición de métodos 2 3 Métodos ocultos Funciones Virtuales 4

33 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia M ÉTODOS V IRTUALES  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 );

34 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO M ÉTODOS V IRTUALES 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 getVel()<<endl; //se accede al método de la clase derivada return 0; }

35 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia M ÉTODOS V IRTUALES Si un método en cuestión es designado "virtual" en la clase base, se llamará a al método de la clase derivada (si existe). Si no es virtual, se llamará a la función de la clase base. El modificador virtual nos permite incluir un método en varios niveles de una jerarquía de clases con el mismo nombre pero con distinta definición. 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

36 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia M ÉTODOS V IRTUALES  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

37 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia M ÉTODOS V IRTUALES 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

38 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia M ÉTODOS V IRTUALES 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

39 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Mé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

40 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONSTRUCTORES Y D ESTRUCTORES V IRTUALES  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

41 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia C ONSTRUCTORES Y D ESTRUCTORES V IRTUALES  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 C ONSTRUCTORES C OPIA V IRTUALES

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

43 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO class 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 = 1 d1.x = 2 d1.y = 3 d2.x = 4 d2.y = 5

44 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO #include 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: int mY.x es tipo: char mZ.x es tipo: char

45 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO using 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: 100 El valor es: 20 El valor es: 25 El valor es: 100 El valor es: 100 El valor es: 100 El valor es: 20 El valor es: 25 El valor es: 100 El valor es: 100

46 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO using 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: 100 El valor es: 20 El valor es: 25 El valor es: 100 El valor es: 100

47 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO using 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 fun(10) fun(10) fun(10) fun(10) fun(10) << endl; return 0; } El valor es: 100 El valor es: 100 El valor es: 100 El valor es: 20 El valor es: 25

48 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO using 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 fun(10) fun(10) fun(10) fun(10) fun(10) << endl; return 0; } El valor es: 100 El valor es: 20 El valor es: 25 El valor es: 20 El valor es: 25

49 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia E JEMPLO using 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: 100 El valor es: 20 El valor es: 100 El valor es: 100 El valor es: 100

50 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática II Universidad de Antioquia Bibliografía  Aprenda C++ Avanzado como si estuviera en primero. Tecnun.  C con clase http://c.conclase.net/curso/?cap=036#inicio http://c.conclase.net/curso/?cap=036#inicio  Sams Teach yourselft C++ in 21 days http://newdata.box.sk/bx/c/htm/ch12.htm http://newdata.box.sk/bx/c/htm/ch12.htm 50


Descargar ppt "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."

Presentaciones similares


Anuncios Google