备忘:
#include <cstdio>
#include <algorithm>
using namespace std;
struct A {
virtual void f1() { printf("A::f1\n"); }
virtual void f2(int& i) { printf("A::f2: %p\n", &i); }
int a = 0x11111111;
};
struct B {
virtual void b1() { printf("B::b1\n"); }
int b = 0x22222222;
};
struct D : public A, public B {
virtual void f1() { printf("D::f1\n"); }
int d = 0x33333333;
};
template<class T> void print(T* a) {
printf("<size: %d>\n", sizeof(T));
auto p = reinterpret_cast<unsigned char*>(a);
auto q = p + sizeof(T);
for_each(p, q, [](unsigned char c) {
printf("%02x ", c);
static int cnt = 0;
if (++cnt%4==0) { printf("\n"); }
});
printf("-- -- -- -- \n\n");
}
void print(unsigned char* p, int len) {
printf("<len: %d>\n", len);
auto q = p + len;
for_each(p, q, [](unsigned char c) {
printf("%02x ", c);
static int cnt = 0;
if (++cnt%4==0) { printf("\n"); }
});
printf("-- -- -- -- \n\n");
}
int main() {
D d;
auto pd = &d;
print(pd);
A* pa = pd;
print(pa);
B* pb = pd;
print(pb);
int* pvt = (int*)(int)*(int*)pd;
auto f = (void (*)(A*))*pvt;
f(pd);
//auto f2 = (void (*)(A*, int&))(*(pvt+1));
void (*f2)(A*, int&) = (void (*)(A*, int&))(*(pvt+1));
int i=0x123;
printf("%p\n", &i);
f2(pd, i);
pd->f2(i);
}
结果:
<size: 20>
58 a5 40 00
11 11 11 11
68 a5 40 00
22 22 22 22
33 33 33 33
-- -- -- --
<size: 8>
58 a5 40 00
11 11 11 11
-- -- -- --
<size: 8>
68 a5 40 00
22 22 22 22
-- -- -- --
D::f1
0022feb0
A::f2: 0022feb4
A::f2: 0022feb0