美文网首页
c++虚表的使用 通过虚表调用虚函数的演示代码

c++虚表的使用 通过虚表调用虚函数的演示代码

作者: 我是榜样 | 来源:发表于2017-03-11 14:00 被阅读0次
//演示一下c++如何找到虚表地址vptr以及如何通过虚表调用虚函数
#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\n", *p1);
    int* p2 = (int*)&b;
    printf("vptr=%p\n", *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;
}

相关文章

  • c++虚表的使用 通过虚表调用虚函数的演示代码

  • 第二周(Geek Band)

    对象模型 1、vptr和vtbl(虚函数与虚表) 调用虚函数vfun,通过虚指针vptr找到虚表vtbl,通过虚表...

  • c++ vtable 解析上篇 | 编程知识3

    从汇编指令的角度来看 c++ 虚表的虚函数的调用方式,看虚表​应该如何设计。 1、环境 x86_64-apple-...

  • GeekBand-C++面向对象高级编程(下)-Week2

    对象模型:虚函数表(vtbl)与虚表指针(vptr) 我们知道,C++中,可以通过虚函数来实现多态性,而虚函数是通...

  • C++虚函数表

    虚函数表 C++中虚函数是通过一张虚函数表(Virtual Table)来实现的,在这个表中,主要是一个类的虚函数...

  • C++ 虚函数表、虚函数讲解

    前言 近期有不少同学私信我询问关于C++ 虚表和虚函数的相关问题,于是就打算写一篇关于C++虚函数和虚表的原理文章...

  • C++虚函数

    C++虚函数 C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才...

  • C++ 虚函数

    C++ 虚函数 虚函数 基类中使用virtual关键字声明的函数,称为虚函数。虚函数的实现,通过虚函数表来实现的。...

  • C++——虚函数表,常见问题,RTTI,typecast

    一、虚表 函数指针数组虚表的位置 override就是子类写的虚函数将父类的虚函数覆盖 虚表是在对象生成的时候才有...

  • 虚表、虚函数

    什么是虚函数? 使用 virtual 关键字修饰的函数即为虚函数,virtual 关键字只能对类中的非静态函数使用...

网友评论

      本文标题:c++虚表的使用 通过虚表调用虚函数的演示代码

      本文链接:https://www.haomeiwen.com/subject/idwagttx.html