实现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;
}
posted on 2017-08-18 10:48 flyingwaters 阅读(224) 评论(0) 收藏 举报
 
                    
                     
                    
                 
                    
                 
                
            
         
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号