En C++ no es posible declarar una función virtual estática, ni echar una función no estática a un puntero de función estilo C.Alternativa a C++ estática métodos virtuales
Ahora, tengo una 'SDK C ol llano que utiliza punteros de función en gran medida.
Tengo que completar una estructura con varios punteros a las funciones. Estaba planeando usar una clase abstracta con un montón de métodos virtuales puros estáticos, y redefinirlos en clases derivadas y llenar la estructura con ellos. No fue hasta entonces que me di cuenta de que estática virtual no está permitida en C++.
También esta firma de la función C SDK no tiene un parámetro userData.
¿Hay alguna buena alternativa? Lo mejor que puedo pensar es definir algunos métodos virtuales puros GetFuncA(), GetFuncB(), ... y algunos miembros estáticos FuncA()/FuncB() en cada clase derivada, que serían devueltos por GetFuncX(). Entonces, una función en la clase abstracta llamaría esas funciones para obtener los punteros y llenar la estructura.
Editar Respondiendo a John Dibling, sería genial ser capaz de hacer esto:
class Base
{
FillPointers() { myStruct.funA = myFunA; myStruct.funB = myFunB; ...}
private:
CStruct myStruct;
static virtual myFunA(...) = 0;
static virtual myFunB(...) = 0;
};
class Derived1 : public Base
{
Derived1() { FillPointers(); }
static virtual myFunA(...) {...};
static virtual myFunB(...) {...};
};
class Derived2 : public Base
{
Derived2() { FillPointers(); }
static virtual myFunA(...) {...};
static virtual myFunB(...) {...};
};
int main()
{
Derived1 d1;
Derived2 d2;
// Now I have two objects with different functionality
}
Hay una buena razón funciones virtuales estáticos no están permitidos. Si tienes una clase que contiene funciones virtuales puras, se vuelve abstracta. No se puede crear una instancia de una clase abstracta, por lo que no hay riesgo de que se invoquen esas funciones. Sin embargo, si permite virtualidades estáticas, podrían ser llamadas desde la clase sin instanciarlo. ¡No habría nada para evitar que se los llamara antes de que se definieran! –
La idea de una función 'estática' se opone directamente a la idea de una función' virtual' pura. Tal vez si usted explica lo que estaba tratando de lograr en lugar de cómo estaba tratando de lograrlo, podríamos darle una mejor orientación. –
¿El SDK C pasa un puntero de contexto a las funciones? Alternativamente, ¿solo necesita tener un manejador activo a la vez? –