es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se puede tener una función virtual de tipo clase Padre y luego anularla como tipo Hijo (c++)?

Dada la siguiente estructura de una clase Padre y 2 hijos.

class Data{
protected:
int data;
};
class TreeData: public Data{
// algo
};
class PlantData: public Data{
// algo
};

Entonces, en algún otro lugar tengo otra estructura de clase para recuperar los datos:

class RecoverData{
protected:
string ip;
int commTimeout;
public:
virtual Data getData();
};
class RecoverTreeData: public RecoverData{
public:
TreeData getData(); //Incorrecto
};
class RecoverPlantData: public RecoverData{
public:
PlantData getData(); //Incorrecto
};

Lógicamente, esto no funcionará porque se define un tipo de retorno, pero luego se devuelve otro. Sin embargo, ¿existe alguna forma de obtener un comportamiento similar? (Teniendo en cuenta esta estructura de clase).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, para obtener un comportamiento similar se puede utilizar el polimorfismo y hacer uso de punteros y referencias. Se puede definir el tipo de retorno en la clase base como un puntero o referencia a la clase padre, que luego puede ser redefinido en las clases hijas para devolver un puntero o referencia al objeto de la clase hija correspondiente.

    Por ejemplo, la clase RecoverData puede ser modificada para devolver un puntero a la clase Data de la siguiente manera:

    class RecoverData{
    protected:
        string ip;
        int commTimeout;
    public:
        virtual Data* getData();
    };
    

    Luego, en las clases hijas, se puede redefinir el método getData() para devolver un puntero al objeto de la clase hija correspondiente:

    class RecoverTreeData: public RecoverData{
    public:
        TreeData* getData();
    };
    
    class RecoverPlantData: public RecoverData{
    public:
        PlantData* getData();
    };
    

    Esto permitirá obtener el comportamiento deseado devolviendo punteros a los objetos de la clase hija correspondientes.

    Alternativamente, también se pueden utilizar referencias en lugar de punteros para lograr un resultado similar, modificando el tipo de retorno de la misma manera:

    class RecoverData{
    protected:
        string ip;
        int commTimeout;
    public:
        virtual Data& getData();
    };
    
    class RecoverTreeData: public RecoverData{
    public:
        TreeData& getData();
    };
    
    class RecoverPlantData: public RecoverData{
    public:
        PlantData& getData();
    };
    

    En conclusión, haciendo uso del polimorfismo y de los tipos de retorno apropiados, se puede obtener un comportamiento similar en esta estructura de clases.

Comments are closed.