Necesito usar un puntero de función miembro que tome un argumento de clase base que se usa en otro código. Bueno, simplemente quiero hacer [algo] como el siguiente ejemplo. Este código funciona bien, pero me pregunto si ese lanzamiento siempre es seguro. No puedo hacer dynamic
o static
emitir aquí.puntero de función de miembro de fundición
#include <cstdio>
class C
{
public:
C() : c('c') {}
virtual ~C() {}
const char c;
};
class D : public C
{
public:
D() : d('d') {}
virtual ~D() {}
const char d;
};
class A
{
public:
A() {}
virtual ~A() {}
void f(C& c) { printf("%c\n",c.c); }
void g(D& d) { printf("%c %c\n",d.c,d.d); }
};
int main (int argc, char const* argv[])
{
void (A::*pf)(C& c) = &A::f;
void (A::*pg)(D& d) = reinterpret_cast<void (A::*)(D&)>(&A::f);
A a;
C c;
D d;
(a.*pf)(c);
(a.*pg)(d);
return 0;
}
Dice que el código funciona bien, pero ni siquiera compila para mí. – Xeo
Compila y (parece) trabajar con un 'reinterpret_cast'; Supongo que la pregunta es, ¿es seguro? –
¿Es frío que f y g sean de hecho virtuales? Si es así, puede anularlos en alguna clase derivada de A. Mucho mejor que el casting. –