1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
#include <cstdio>
#include <cstring>
class Base {
public:
size_t data;
virtual ~Base() {}
void regular() {
printf("Regular Base\n");
}
virtual void dynamic() {
printf("Dynamic Base\n");
}
virtual void dynamic2() {
printf("Dynamic2 Base\n");
}
};
class Derived : public Base {
public:
void regular() {
printf("Regular Derived\n");
}
virtual void dynamic() {
printf("Dynamic Derived\n");
}
virtual void dynamic2() {
printf("Dynamic2 Derived\n");
}
};
typedef void (Base::*Fn)();
void doRegularCall(Base *m, Fn fn) {
(m->*fn)();
}
void doPlainCall(Base *m, Fn fn) {
typedef void (*Plain)(Base *);
Plain plain;
memcpy(&plain, &fn, sizeof(Plain));
printf("Plain function: %p\n", plain);
(*plain)(m);
}
void doCall(Base *m, Fn fn) {
printf("Regular: ");
doRegularCall(m, fn);
// printf("Plain: ");
// doPlainCall(m, fn);
}
void doCall(Base *m, void (Derived::*fn)()) {
Fn f;
memcpy(&f, &fn, sizeof(Fn));
doCall(m, f);
}
int main() {
printf("Size of fn pointer: %d\n", int(sizeof(Fn)));
Base b;
printf("-- base --\n");
doCall(&b, &Base::regular);
doCall(&b, &Base::dynamic);
doCall(&b, &Base::dynamic2);
Derived d;
printf("-- derived --\n");
doCall(&d, &Base::regular);
doCall(&d, &Base::dynamic);
printf("-- crazy -- \n");
doCall(&d, &Derived::regular);
doCall(&d, &Derived::dynamic);
return 0;
}
|