A diferencia de las funciones miembro virtuales, necesito una solución en la que una función implementada en cada derivación de clase de nivel pueda registrarse para una llamada posterior por la clase base. (No solo la implementación más derivada)Cómo registrar un puntero de función de miembro derivado de clase con una clase base
Para hacer esto, estaba pensando en proporcionar un mecanismo para que las clases derivadas registren su función con la clase base, como durante el constructor de la clase derivada.
No obstante, tengo problemas con el argumento del puntero a la función miembro. Estaba pensando que Derived se deriva de Base, el puntero this
se debe convertir automáticamente.
¿Se puede hacer esto cerca de lo que estoy intentando o necesito usar funciones de miembro estáticas, void *
y static_cast
?
class Base
{
protected:
typedef void (Base::*PrepFn)(int n);
void registerPrepFn(PrepFn fn) {};
}
class Derived : public Base
{
Derived() {
registerPrepFn(&Derived::derivedPrepFn);
};
void derivedPrepFn(int n) {};
}
de error del compilador:
error: no matching function for call to 'Derived::registerPrepFn(void (Derived::*)(int))'
note: candidates are: 'void Base::registerPrepFn(void (Base::*)(int))'
No estoy seguro exactamente de lo que quiere hacer. Pero ciertamente no es posible de esta manera; una función miembro definida en 'Derived' no puede ser apuntada por' Base :: * '. Quizás si explica el objetivo de nivel superior, alguien podría sugerir una mejor solución. –
FTR, 'void *' y 'static_cast' tampoco funcionarán, porque un puntero a la función miembro no es un puntero (sí, tiene un nombre horrible). –
con respecto a la conversión estática, estaba pensando que podría implementar funciones de miembro estáticas y explícitamente pasar alrededor de este puntero – NoahR