namespace pointer_to_member_func
{
struct A
{
void foo() const {
std::cout << “A’s this:\t” << this << std::endl;
}
char pad0[32];
};
struct B
{
void bar() const {
std::cout << "B's this:\t" << this << std::endl;
}
char pad2[64];
};
struct C : A, B
{ };
void call_by_ptr(const C &obj, void (C::*mem_func)() const)
{
void *data[2];
std::memcpy(data, &mem_func, sizeof(mem_func));
std::cout << "------------------------------\n"
"Object ptr:\t" << &obj <<
"\nFunction ptr:\t" << data[0] <<
"\nPointer adj:\t" << data[1] << std::endl;
(obj.*mem_func)();
}
void test()
{
C obj;
call_by_ptr(obj, &C::foo);
call_by_ptr(obj, &C::bar);
}
}
namespace pointer_to_virtual_member_func
{
struct A
{
virtual void foo() const {
std::cout << "A's this:\t" << this << std::endl;
}
char pad0[32];
};
struct B
{
virtual void bar() const {
std::cout << "B's this:\t" << this << std::endl;
}
char pad2[64];
};
struct C : A, B
{ };
void call_by_ptr(const C &obj, void (C::*mem_func)() const)
{
void *data[2];
std::memcpy(data, &mem_func, sizeof(mem_func));
std::cout << "------------------------------\n"
"Object ptr:\t" << &obj <<
"\nFunction ptr:\t" << data[0] <<
"\nPointer adj:\t" << data[1] << std::endl;
(obj.*mem_func)();
}
void test()
{
C obj;
call_by_ptr(obj, &C::foo);
call_by_ptr(obj, &C::bar);
}
}
输出结果如下:
Object ptr: 0x7fffb54de600
Function ptr: 0x466606
Pointer adj: 0
A’s this: 0x7fffb54de600
Object ptr: 0x7fffb54de600
Function ptr: 0x466648
Pointer adj: 0x20
B’s this: 0x7fffb54de620
Object ptr: 0x7fffb54de5e0
Function ptr: 0x1
Pointer adj: 0
A’s this: 0x7fffb54de5e0
Object ptr: 0x7fffb54de5e0
Function ptr: 0x1
Pointer adj: 0x28
B’s this: 0x7fffb54de608
对应虚函数的16字节,前8个字节为其函数在虚函数表中的偏移量,后一个8字节是this指针相对于对象地址的偏移量,而此8字节,如果用sizeof计算的话是不包括在内的,上面的类是96B,下面是112B