Hilo
Una cosa lo de la classe virtual para que sirve....... (iper) 2017-11-09 16:39:13
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Una cosa lo de la classe virtual para que sirve....... (Steven Davidson) 2017-11-09 18:51:03
Hola Colegio,
Sirve para preparar el uso de polimorfismo (dinámico). Brevemente, el
polimorfismo es una prestación para manipular un objeto de una clase como
si fuere de otra. Se necesita dos características para el polimorfismo:
- Formación de una jerarquía (hereditaria) de clases virtuales
- Manipulación de objetos, mediante un puntero o una referencia a ellos, de
tal jerarquía de clases virtuales
Por ejemplo,
class vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();
};
class automovil : public vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();
};
class barco : public vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();
};
class avion : public vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();
};
int main()
{
vehiculo * lista[5];
lista[0] = new barco;
lista[1] = new avion;
lista[2] = new atuomovil;
lista[3] = new atuomovil;
lista[4] = new avion;
for( int i=0; i < 5; i++ )
{
lista[i]-> arrancar();
lista[i]-> avanzar();
}
...
}
Como puedes ver, 'lista' es un array de punteros a objetos de tipo
'vehiculo', por lo que podemos invocar las funciones miembro: 'arrancar()'
y 'avanzar()'. Sin embargo, internamente cada objeto sabe cuál es su tipo
original. Cuando se invoque una de estas funciones miembro virtuales,
internamente se invocará la versión "correcta" que corresponde a su clase
original. Por ejemplo,
lista[0]-> arrancar() // se invocará: barco::arrancar() porque el objeto
apuntado es en realidad de tipo 'barco'
lista[1]-> arrancar() // se invocará: avion::arrancar()
lista[2]-> arrancar() // se invocará: automovil::arrancar()
lista[3]-> arrancar() // se invocará: automovil::arrancar()
lista[4]-> arrancar() // se invocará: avion::arrancar()
Echa un vistazo al capítulo 37 :
http://c.conclase.net/curso/index.php?cap=037#inicio
Espero que esto te oriente.
Steven
On Thu, Nov 9, 2017 at 11:39 AM, <colegio4497@disroot.org> wrote:
>
>
>
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: Una cosa lo de la classe virtual para que sirve....... (Nelson Victor Cruz Hernandez) 2017-11-10 07:01:46
Excelente ejemplo, muy completo. Gracias.
El 9 nov. 2017 12:51 PM, "Davidson, Steven" <srd4121@njit.edu> escribió:
> Hola Colegio,
>
> Sirve para preparar el uso de polimorfismo (dinámico). Brevemente, el
> polimorfismo es una prestación para manipular un objeto de una clase como
> si fuere de otra. Se necesita dos características para el polimorfismo:
>
> - Formación de una jerarquía (hereditaria) de clases virtuales
> - Manipulación de objetos, mediante un puntero o una referencia a ellos,
> de tal jerarquía de clases virtuales
>
> Por ejemplo,
>
> class vehiculo
> {
> public:
> virtual void arrancar();
> virtual void detener();
> virtual void avanzar();
> };
>
> class automovil : public vehiculo
> {
> public:
> virtual void arrancar();
> virtual void detener();
> virtual void avanzar();
> };
>
> class barco : public vehiculo
> {
> public:
> virtual void arrancar();
> virtual void detener();
> virtual void avanzar();
> };
>
> class avion : public vehiculo
> {
> public:
> virtual void arrancar();
> virtual void detener();
> virtual void avanzar();
> };
>
> int main()
> {
> vehiculo * lista[5];
>
> lista[0] = new barco;
> lista[1] = new avion;
> lista[2] = new atuomovil;
> lista[3] = new atuomovil;
> lista[4] = new avion;
>
> for( int i=0; i < 5; i++ )
> {
> lista[i]-> arrancar();
> lista[i]-> avanzar();
> }
> ...
> }
>
> Como puedes ver, 'lista' es un array de punteros a objetos de tipo
> 'vehiculo', por lo que podemos invocar las funciones miembro: 'arrancar()'
> y 'avanzar()'. Sin embargo, internamente cada objeto sabe cuál es su tipo
> original. Cuando se invoque una de estas funciones miembro virtuales,
> internamente se invocará la versión "correcta" que corresponde a su clase
> original. Por ejemplo,
>
> lista[0]-> arrancar() // se invocará: barco::arrancar() porque el objeto
> apuntado es en realidad de tipo 'barco'
> lista[1]-> arrancar() // se invocará: avion::arrancar()
> lista[2]-> arrancar() // se invocará: automovil::arrancar()
> lista[3]-> arrancar() // se invocará: automovil::arrancar()
> lista[4]-> arrancar() // se invocará: avion::arrancar()
>
>
> Echa un vistazo al capítulo 37 : http://c.conclase.net/curso/
> index.php?cap=037#inicio
>
>
> Espero que esto te oriente.
>
> Steven
>
>
> On Thu, Nov 9, 2017 at 11:39 AM, <colegio4497@disroot.org> wrote:
>
>>
>>
>>
> _______________________________________________
> Lista de correo Cconclase Cconclase@listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Fwd: Re: Una cosa lo de la classe virtual para que sirve....... (iper) 2017-11-10 18:30:58
La verdad es que
estubo muy bien gracias!!!!!!!!!!!!!!!!!!!!
-------- Forwarded message -------
From: "Victor Cruz" <victor.cruz.isc@gmail.com (mailto:%22Victor%20Cruz%22%20<victor.cruz.isc@gmail.com> )>
To: "Lista de correo sobre C y C++" <cconclase@listas.conclase.net (mailto:%22Lista%20de%20correo%20sobre%20C%20y%20C++%22%20<cconclase@listas.conclase.net> )>
Sent: November 10, 2017 9:41 AM
Subject: Re: [C con Clase] Una cosa lo de la classe virtual para que sirve.......
Excelente ejemplo, muy completo. Gracias.
El 9 nov. 2017 12:51 PM, "Davidson, Steven" <srd4121@njit.edu (mailto:srd4121@njit.edu)> escribió:
Hola Colegio,
Sirve para preparar el uso de polimorfismo (dinámico). Brevemente, el polimorfismo es una prestación para manipular un objeto de una clase como si fuere de otra. Se necesita dos características para el polimorfismo:
- Formación de una jerarquía (hereditaria) de clases virtuales
- Manipulación de objetos, mediante un puntero o una referencia a ellos, de tal jerarquía de clases virtuales
Por ejemplo,
class vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();
};
class automovil : public vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();};
class barco : public vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();};
class avion : public vehiculo
{
public:
virtual void arrancar();
virtual void detener();
virtual void avanzar();};
int main()
{
vehiculo * lista[5];
lista[0] = new barco;
lista[1] = new avion;
lista[2] = new atuomovil;
lista[3] = new atuomovil;
lista[4] = new avion;
for( int i=0; i < 5; i++ )
{
lista[i]-> arrancar();
lista[i]-> avanzar();
}
...
}
Como puedes ver, 'lista' es un array de punteros a objetos de tipo 'vehiculo', por lo que podemos invocar las funciones miembro: 'arrancar()' y 'avanzar()'. Sin embargo, internamente cada objeto sabe cuál es su tipo original. Cuando se invoque una de estas funciones miembro virtuales, internamente se invocará la versión "correcta" que corresponde a su clase original. Por ejemplo,
lista[0]-> arrancar() // se invocará: barco::arrancar() porque el objeto apuntado es en realidad de tipo 'barco'
lista[1]-> arrancar() // se invocará: avion::arrancar()
lista[2]-> arrancar() // se invocará: automovil::arrancar()
lista[3]-> arrancar() // se invocará: automovil::arrancar()
lista[4]-> arrancar() // se invocará: avion::arrancar()
Echa un vistazo al capítulo 37 : http://c.conclase.net/curso/index.php?cap=037#inicio (http://c.conclase.net/curso/index.php?cap=037#inicio)
Espero que esto te oriente.
Steven
On Thu, Nov 9, 2017 at 11:39 AM, <colegio4497@disroot.org (mailto:colegio4497@disroot.org)> wrote:
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net (mailto:Cconclase@listas.conclase.net)
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net (http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net)
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ (http://listas.conclase.net/index.php?gid=2&mnu=FAQ)
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ