1
Informática IISesión 11: Herencia (1) – herencia simple
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
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
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
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.
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
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
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
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
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)
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)
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)
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)
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)
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)
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
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
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
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
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
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
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
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;}
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
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
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
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;
}
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
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
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();
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;
}
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
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 );
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;
}
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
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
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
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
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
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
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
2009/1Circuitos Digitales III 2010/1Circuitos Digitales III 2010/1Circuitos Digitales IIICircuitos Digitales III 2010/1Informática II Universidad de Antioquia42
ALGUNOS EJEMPLOS
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
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
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
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
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
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
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
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