User Tag List

Resultados 1 al 12 de 12

Tema: Herencia en C++?

  1. #1

    Fecha de ingreso
    Aug 2003
    Ubicación
    Madrid (Getafe)
    Mensajes
    13,901
    Mencionado
    48 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5
    Agradecer Thanks Received 
    221
    Thanked in
    Agradecido 164 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2

    Herencia en C++?

    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
    Última edición por Aiken; 15/12/2007 a las 11:59

  2. #2

    Fecha de ingreso
    Mar 2005
    Mensajes
    3,145
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    29
    Thanked in
    Agradecido 19 veces en [ARG:2 UNDEFINED] posts
    &#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?
    Última edición por PharaOnyx; 15/12/2007 a las 12:03

  3. #3

    Fecha de ingreso
    Aug 2006
    Ubicación
    Bilbao
    Mensajes
    494
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    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.

  4. #4

    Fecha de ingreso
    Aug 2003
    Ubicación
    Madrid (Getafe)
    Mensajes
    13,901
    Mencionado
    48 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5
    Agradecer Thanks Received 
    221
    Thanked in
    Agradecido 164 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2
    Cita Iniciado por headoverheels Ver mensaje
    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!!

    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

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

    Aiken

  5. #5

    Fecha de ingreso
    Mar 2005
    Mensajes
    3,145
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    29
    Thanked in
    Agradecido 19 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por Aiken Ver mensaje
    Aunque sea "virtual", tambien puede tener codigo dentro el metodo para cuando el objeto es base no?
    Sí, sin problema

    Saludos, Alex

  6. #6

    Fecha de ingreso
    Aug 2006
    Ubicación
    Bilbao
    Mensajes
    494
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por Aiken Ver mensaje
    Aunque sea "virtual", tambien puede tener codigo dentro el metodo para cuando el objeto es base no?
    Aiken
    Sí, no hay ningún problema.

  7. #7

    Fecha de ingreso
    Aug 2003
    Ubicación
    Madrid (Getafe)
    Mensajes
    13,901
    Mencionado
    48 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5
    Agradecer Thanks Received 
    221
    Thanked in
    Agradecido 164 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2
    YEEEES!!! SIII!! Os debo una!

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

    Lo dicho, una ronda de
    Aiken
    < - >
    Cita Iniciado por PharaOnyx Ver mensaje
    Sí, sin problema

    Saludos, Alex

    Pareceis CLONES los dos respondeis clavao!

    Aiken
    Última edición por Aiken; 15/12/2007 a las 12:13 Razón: Edición automática anti doble-post.

  8. #8

    Fecha de ingreso
    Aug 2006
    Ubicación
    Bilbao
    Mensajes
    494
    Mencionado
    0 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    0
    Thanked in
    Agradecido 0 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por Aiken Ver mensaje
    Pareceis CLONES los dos respondeis clavao!
    pero siempre se me adelanta PharaOnyx !!!!

  9. #9

    Fecha de ingreso
    Mar 2005
    Mensajes
    3,145
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    29
    Thanked in
    Agradecido 19 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por headoverheels Ver mensaje
    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 x'DDDDDDDDDDDDDDD

  10. #10

    Fecha de ingreso
    Aug 2003
    Ubicación
    Madrid (Getafe)
    Mensajes
    13,901
    Mencionado
    48 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5
    Agradecer Thanks Received 
    221
    Thanked in
    Agradecido 164 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2
    gracias chicos!

  11. #11

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,542
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,655
    Agradecer Thanks Received 
    1,919
    Thanked in
    Agradecido 1,288 veces en [ARG:2 UNDEFINED] posts
    Para que quede mejor, virtualizar funciones no miembro:

    Código:
    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();

  12. #12

    Fecha de ingreso
    Aug 2003
    Ubicación
    Madrid (Getafe)
    Mensajes
    13,901
    Mencionado
    48 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    5
    Agradecer Thanks Received 
    221
    Thanked in
    Agradecido 164 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    2
    Cita Iniciado por swapd0 Ver mensaje
    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

    Aiken

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •