zoukankan      html  css  js  c++  java
  • 实现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;
    }

  • 相关阅读:
    十万个为什么
    安装VmwareTools遇到的问题
    CentOS7没有ifconfig命令怎么办
    ftp/ http/ https/ tcp的关系
    C/S和B/S架构
    Nginx 安装以及验证教程
    osi七层模型
    在linux上安装tenginx
    Awvs、Snort的下载安装
    Laravel——DI(依赖注入)
  • 原文地址:https://www.cnblogs.com/fenglongyu/p/7388337.html
Copyright © 2011-2022 走看看