zoukankan      html  css  js  c++  java
  • c++虚表的使用 通过虚表调用虚函数的演示代码

    //演示一下c++如何找到虚表地址vptr以及如何通过虚表调用虚函数
    //zhangpeng@myhexin.com 20130811
    #include <iostream>
    using namespace std;
    class CTest
    {
    public:
    	CTest(){}
    	virtual void Print(){cout<<"hello world"<<endl;}
    };
    
    int main()
    {
    	CTest a;
    	CTest b;
    	//*p1,*p2存储的是虚表的地址vptr
    	//根据<<Inside the c++ object mode>>第一章虚表的第一项是typeinfo,第二项应该是第一个虚函数Add()。
    	//但vc++2010这里第一项就是Add()
    	int* p1 = (int*)&a;
    	printf("vptr=%p
    ", *p1);
    	int* p2 = (int*)&b;
    	printf("vptr=%p
    ", *p2);
    	int* vptr = (int*)(*p2);
    
    	//通过虚表直接调用Add
    	typedef void(*FUNC)();
    	//这里参数不太确定,参数为void也是可以的
    	typedef void(*FUNC2)(CTest*);
    	FUNC pf = (FUNC)vptr[0];
    	//书中说函数在虚表里会被改为void func(CTest*)
    	FUNC2 pf2 = (FUNC2)pf;
    	pf2(&a);
    	cin.get();
    	return 0;
    }
    
     
    


  • 相关阅读:
    hadoop hdfs总结 NameNode部分 概述
    最近近况
    hadoop hdfs总结 NameNode部分 1
    rsync 使用
    SmartHost
    hadoop unit test 问题
    git 使用记录
    java 类内存分配计算
    hadoop hdfs总结 NameNode部分 2
    0417 430调试技巧
  • 原文地址:https://www.cnblogs.com/pangblog/p/3253545.html
Copyright © 2011-2022 走看看