实现Vptr调用Vtbl

#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;
}

原文地址:https://www.cnblogs.com/fenglongyu/p/7388337.html