#include <iostream>
#include <stdio.h>
int func_0(int a, int b)
{
return a + b;
}
class A
{
public:
A() {}
~A() {}
void func_1()
{
std::cout << "func_1 in A!" << std::endl;
}
virtual void func_2()
{
std::cout << "func_2 in A!" << std::endl;
}
static void func_3()
{
std::cout << "func_3 in A!" << std::endl;
}
};
class B : public A
{
public:
B() {}
~B() {}
void func_1()
{
std::cout << "func_1 in B!" << std::endl;
}
virtual void func_2()
{
std::cout << "func_2 in B!" << std::endl;
}
static void func_3()
{
std::cout << "func_3 in B!" << std::endl;
}
};
template<typename addressType, typename funcType>
addressType union_cast(funcType func_ptr) // 获取类内成员函数的函数地址
{
union
{
funcType f;
addressType d;
}u;
u.f = func_ptr;
return u.d;
}
#define asm_cast(var, addr) \
{ \
__asm \
{ \
mov var, offset addr \
} \
}
int main()
{
A *pA = new B;
pA->func_2();
typedef int(*func_0_pointer)(int a, int b);
func_0_pointer pFunc_0 = func_0;
std::cout << "func_0: " << pFunc_0 << std::endl;
typedef void(A::*func_1_pointer)();
typedef void(A::*func_2_pointer)();
typedef void(*func_3_pointer)();
func_1_pointer pFunc_1 = &A::func_1;
func_2_pointer pFunc_2 = &A::func_2;
func_3_pointer pFunc_3 = &A::func_3;
std::cout << "A::func_1: " << pFunc_1 << std::endl;
std::cout << "A::func_2: " << pFunc_2 << std::endl;
std::cout << "A::func_3: " << pFunc_3 << std::endl;
void *ptr_1 = union_cast<void *>(&A::func_1);
void *ptr_2 = union_cast<void *>(&A::func_2);
void *ptr_3 = nullptr;
void *ptr_4 = nullptr;
asm_cast(ptr_3, A::func_1);
asm_cast(ptr_4, A::func_2);
std::cout << "A::func_1: " << ptr_1 << std::endl;
std::cout << "A::func_2: " << ptr_2 << std::endl;
std::cout << "A::func_1: " << ptr_3 << std::endl;
std::cout << "A::func_2: " << ptr_4 << std::endl;
printf("A::func_2: %p", &A::func_2);
}
环境为VS2017,输出结果如下:

有如下问题:
为什么A::func_2的地址通过union和汇编方式输出有差异。
为什么A::func_2是虚函数,但是输出的不是偏移量。
望解答~