#include <iostream>
#include <cstring>
using namespace std;
class A
{
public:
virtual void fun(){cout<<1<<endl;}
virtual void fun2(){cout<<2<<endl;}
};
class B:public A
{
public:
void fun(){cout<<3<<endl;}
void fun2(){cout<<4<<endl;}
};
int main()
{
void (*fun) (A*);//函数指针,返回类型为 void,形参列表
A *p=new B;
long lVptrAddr;
memcpy(&lVptrAddr,p,4);
//取出vptr指向的虚函数表第一个地址拷贝构造lVptrAddr-----long型来表示地址
//memcpy将p指针指向的内容,的前四位拷贝进&lVptrAddr所指的内存中
//C and C++ 内存拷贝函数,引用C #inlude <string.h> 引用C++ #inlude <cstring>
memcpy(&fun,reinterpret_cast<long*>(lVptrAddr),4);
//typename 必须是一个指针,引用,算术类型,函数指针或者成员指针
//reinterpret_cast<typename>(expression)强制类型转换,一般用于转回原有类型
//映射到完全不同类型的意思,
//static_cast<B*>()会进行的智能的指针转换到合理的位置
(*fun)(p);
fun(p);
//两种方式都可以访问 fun函数指针的函数
delete p;
system("pause");
return 0;
}