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

  • 相关阅读:
    手机通讯录实现
    leetcode
    android 上手维修设备和推断启动服务
    MVC Code First (代码优先)
    10000阶乘
    telnet发电子邮件
    nodejs显现events.js:72抛出错误
    指针
    脑洞门大开思维工具:六顶思考帽
    C#实现CAD数据转shape或mdb
  • 原文地址:https://www.cnblogs.com/fenglongyu/p/7388337.html
Copyright © 2011-2022 走看看