Punteros a funciones de clases
Queremos utilizar punteros a metodos de clases.
Para ello, utilizamos una referencia a un objeto de la clase y un puntero a la funcion de la clase. Ver codigo
Funciona tambien con clases derivadas creadas mediante factorias:
#include <iostream>
class Clase
{
public:
virtual int funcion1(int x, int y)
{
std::cout << "Funcion 1 (" << x << ":" << y << ")" << std::endl;
}
virtual int funcion2(int x, int y)
{
std::cout << "Funcion 2 (" << x << ":" << y << ")" << std::endl;
}
};
class Hija1 : public Clase
{
public:
int funcion1(int x, int y)
{
std::cout << "Hija 1: Funcion 1 (" << x << ":" << y << ")" << std::endl;
}
int funcion2(int x, int y)
{
std::cout << "Hija 1: Funcion 2 (" << x << ":" << y << ")" << std::endl;
}
};
class Hija2 : public Clase
{
public:
int funcion1(int x, int y)
{
std::cout << "Hija 2: Funcion 1 (" << x << ":" << y << ")" << std::endl;
}
int funcion2(int x, int y)
{
std::cout << "Hija 2: Funcion 2 (" << x << ":" << y << ")" << std::endl;
}
};
class Factory
{
public:
Clase *getClase(int x)
{
Clase *clase;
if (x)
{
clase = new Hija2;
}
else
{
clase = new Hija1;
}
}
};
void ejecuta(Clase &clase, int (Clase::*funcion)(int, int))
{
(clase.*funcion)(10, 20);
}
int main(int argc, char **argv)
{
Clase *clase;
Factory f;
clase = f.getClase(0);
ejecuta(*clase, &Clase::funcion1);
ejecuta(*clase, &Clase::funcion2);
clase = f.getClase(1);
ejecuta(*clase, &Clase::funcion1);
ejecuta(*clase, &Clase::funcion2);
return 0;
}