PDA

Ver la versión completa : Herencia en C++?



Aiken
15/12/2007, 11:56
hola,

tengo este caso.

clasebase;
clasehija1 deriva de clasebase;
clasehija2 deriva de clasebase;

clasebase::escribe() { cout << "escribe_base"; }
clasehija1::escribe() { cout << "escribe_hija1"; }
clasehija2::escribe() { cout << "escribe_hija2"; }

Programita de uso:

--------------------------
clasebase objeto1;
objeto1 = new clasehija1();
objeto1->escribe();
--------------------------

Resultado: "escribe_base";


MI PROBLEMA: Tengo el objeto1 en el que quiero guardar objetos "hijos" de cualquier tipo.
Porque solo tengo esa variable objeto1, luego lo unico que se me ha ocurrido es crearla de tipo "base" para que pueda guardar cualquier hijo.

Es decir en el ejemplo anterior objeto1->escribe() -> yo queria que escribiese "escribe_hija1". pero parece que por herencia de c++, al ser objeto1 de tipo base pues ejecuta el metodo base, no el de la clase derivada.

Como puedo simular el comportamiento este que quiero? parece una situacion muy
normal lo que busco no? o no lo es tanto? :(


Se me ocurre esto, pero parece una marranada y no se si funciona :(
void *objeto1;
objeto1 = (clasehija1 *)new clasehija1();
((clasehija1 *)objeto1)->escribe();


Aiken

PharaOnyx
15/12/2007, 12:00
&#191;No ser&#225; que tienes que declarar el m&#233;todo en la clase padre como 'redefinible' para que las hijas lo puedan 'redefinir'?

Saludos, Alex

edito: siento no ser muy concreto (hace mucho que no hago modelado de objetos con C++) pero... &#191;no era con la palabra reservada 'virtual' en el m&#233;todo del padre?

headoverheels
15/12/2007, 12:07
Es lo que dice PharaOnyx. Tienes que definir los métodos como virtuales para que cuando los llames desde un puntero a la clase base, se llame en realidad al método de la clase derivada.

Aiken
15/12/2007, 12:10
Es lo que dice PharaOnyx. Tienes que definir los métodos como virtuales para que cuando los llames desde un puntero a la clase base, se llame en realidad al método de la clase derivada.

veis como el saber no ocupa lugar!! :D

voy a probarlo, sabia que tenia que ser algo de eso, pero es que mi C++ lo aprendi yo solo a matacaballo, en la facultad no nos enseñaron, y ademas lo tengo oxidado :D

voy a probar.
Aunque sea "virtual", tambien puede tener codigo dentro el metodo para cuando el objeto es base no?

Aiken

PharaOnyx
15/12/2007, 12:11
Aunque sea "virtual", tambien puede tener codigo dentro el metodo para cuando el objeto es base no?
Sí, sin problema :)

Saludos, Alex

headoverheels
15/12/2007, 12:12
Aunque sea "virtual", tambien puede tener codigo dentro el metodo para cuando el objeto es base no?
Aiken
Sí, no hay ningún problema.

Aiken
15/12/2007, 12:13
YEEEES!!! SIII!! Os debo una! :brindis:

Me peta el programa pero porque tengo algun bug, pero al menos ejecuta la funcion hija ;)

Lo dicho, una ronda de :brindis:
Aiken

< - >

Sí, sin problema :)

Saludos, Alex


Pareceis CLONES :D los dos respondeis clavao! :D

Aiken

headoverheels
15/12/2007, 12:15
Pareceis CLONES :D los dos respondeis clavao! :D

:lol: pero siempre se me adelanta PharaOnyx !!!!

PharaOnyx
15/12/2007, 12:18
:lol: pero siempre se me adelanta PharaOnyx !!!!
Porque sufro de 'posteaci&#243;n precoz' :\ x'D

Saludos, Alex

pd: pero vamos Aiken, a ver si te crees que no hemos visto que has posteado 2 veces :p x'DDDDDDDDDDDDDDD

Aiken
15/12/2007, 12:32
:D gracias chicos! :brindis:

swapd0
15/12/2007, 20:32
Para que quede mejor, virtualizar funciones no miembro:



class A
{
public:
...
ostream & escribe(ostream &str) const
{
return str << "clase A";
}
};

class B : public A
{
public:
...
ostream & escribe(ostream &str) const
{
return str << "clase B";
}
};

ostream & operator<<(ostream &out, const A& obj)
{
return obj.escribe(out);
}
// asi puedes usar
cout << foo;
// que queda mejor que esto
foo.escribe();

Aiken
16/12/2007, 00:03
Para que quede mejor, virtualizar funciones no miembro:



no era lo que estaba buscando ahora mismo, pero era cuestion de tiempo que necesitara sobreescribir el operador << asi que mola! ;) gracias :brindis:

Aiken