jueves, 7 de julio de 2011

C++:Uso de metodos virtuales en herencias

Hola, he tenido una semana algo atareada por otro proyecto que es mas importante en este momento para mi, así que tendré paciencia en seguir trabajando con OpenFrameworks y me aguantaré un poco las ganas de aprender al máximo esta herramienta.

Trabajando un poco con clases heredadas en c++, me encontré con un concepto que utilizo mucho en c# como las clases base con métodos virtuales y métodos que se sobre-escriben en las clases hijas, concepto importante para poder manipular diferentes comportamientos pero que por parentesco se relacionan en algún punto de la aplicación.

En el primer proyecto que tengo tengo otras definiciones y otras clases, pero explicaré con otro tipo de contexto mas entendible como para que no se olvide.

Antes de iniciar la explicación de las experiencias, debemos tener en cuenta el contexto: hay una clase base llamada "Humano" y otra clase llamada "Carlos".

Experiencia 1: (Como se haría en C#, de hecho es algo parecido a C++)

//Clase Humano
abstract class Humano
{
public virtual void comer()
{
//el ser humano come de una manera común (todo entra por la boca, no se puede discutir esto... jejeje XD)
}
}

//Clase Carlos
public class Carlos: Humano
{
public overwrite void comer()
{
//carlos tiene un estilo diferente de comer(es decir, carlos puede coger el tenedor o los cubiertos con un estilo propio a carlos)
}
}

Mi primera experiencia con C++ fue:

//Clase Humano
class Humano
{
public:
virtual void comer();
}

//Clase Carlos
class Carlos: Humano
{
public:
void Humano::comer(){} <---------- ERROR: forma erronea de escribir el metodo sobre-escrito
}

La segunda experiencia fue: (referenciada del libro "Pensar en C++, tomo 1" en el capitulo "Polimorfismo y funciones virtuales")


//Clase Humano
class Humano
{
public:
virtual void comer();
}

//Clase Carlos
class Carlos: Humano
{
public:
void comer(){} <---------- casi obvio, pero tuve que consultar en el libro para saberlo
}

pero hay un detallito importante, si la funcion o el metodo no se sobre-escribe dentro del archivo Carlos.h si no que se va a sobre-escribir en el archivo Carlos.cpp, el metodo no debe ir en el archivo Carlos.h. Este detalle fue el que me dio dificultad tener en cuenta.