首页 > 其他分享 >虚函数指针和虚表

虚函数指针和虚表

时间:2023-09-18 16:34:21浏览次数:55  
标签:虚表 函数 子类 函数指针 父类 指针

  • 虚函数指针是一个指向指针数组(定义类对象时, 编译器自动将类对象虚函数指针指向这个虚函数表)的void类型的指针(void**),虚表是一个一维数组,无论是类指针还是类引用还是实例化base1,base2它们只有一个虚函数指针和一个虚函数表,也就是说虚函数指针和虚函数表是属于类的(也就是被所有对象共享的)
  • 子类不会继承父类的虚函数指针,子类有自己的虚函数指针,子类会复制父类的虚函数表,如果子类重写父类的虚函数,那么该虚函数的地址是子类的重写的虚函数的地址。

  

  

上图中p是基类指针或引用,它指向了子类,并调用虚函数发生多态,而它调用虚函数的过程是p调用动态类型的虚函数指针,虚函数指针像数组指针那样取出虚函数表中的某个元素也就是虚函数的地址,并且根据地址调用该虚函数。

C++中的虚函数表实现机制以及用C语言对其进行的模拟实现 - 陪她去流浪 (twofei.com)

标签:虚表,函数,子类,函数指针,父类,指针
From: https://www.cnblogs.com/Sandals-little/p/17712324.html

相关文章

  • 函数指针与指针函数
    int*test(inta,charb){ printf("%d\n",a);}voidtest1(inta){ printf("%d\n",a*a);}voidtest2(inta){ printf("%d\n",a*5);}intmain(){ int*(*p)(int,char)=test; p(10,'1'); return0;......
  • C++ 函数指针与Lambda匿名函数
    函数指针c语言学过了,这里简单记一下,下面举例一个用法就行:#include<iostream>#include<vector>template<classT>voidprint(Tv){ std::cout<<v<<std::endl;}template<classT1,classFunc>voidForEach(std::vector<T1>&v,Func......
  • C++无法将类的成员函数赋值给一般的函数指针,解决方案
    遇到需要绑定回调函数的API接口。看了定义的函数指针,是静态的函数指针,将非静态的类成员函数赋值过去的时候,无法编译通过。将成员函数改成静态又得将整个类的内容都改成静态。这种情况下,可以构造匿名函数,引用this,这样可以在类中,将自己的成员函数赋值给需要的函数指针类型上:ser......
  • 函数指针、std::function、std::bind
    函数指针、std::function、std::bind函数指针:C++语法中可以直接将函数名作为指针,voidfun(inta,intb);在这个函数声明中,函数指针即为fun,传入要被调用的地方时只需要传入fun就可以。但是这个函数指针是什么类型呢?需要明确函数指针类型及其写法,我们才能在要调用函数的形......
  • C++逆向分析——多态和虚表
    虚表上一章了解了多态,那么我们来了解一下多态在C++中是如何实现的。了解本质,那就通过反汇编代码去看就行了,首先我们看下非多态的情况下的反汇编代码:然后再来看下多态情况下的反汇编代码:很明显这里多态的情况下会根据edx间接调用,而非多态则会直接调用。那么我们来看下间接调用的流程......
  • C++函数传递函数指针、仿函数、绑定器、可调用对象
    只定义voidtestFunc(intnum,conststd::function<int(int)>&functor)就可以,其他的相当于这个函数的特化版本#include<iostream>#include<functional>usingnamespacestd;intfunc1(intnum){cout<<"func1:"<<num<<en......
  • 析构函数虚表指针回填问题
    1问题提出笔者偶然发现对于含有虚函数的类,析构函数也会更新虚表指针。小有所得,特此记录。这里使用vs202232位debug作为实验环境。对于一个有虚函数的类,编译器在生成构造函数时,不只生成我们自己写的虚构函数里面的语句,还会把虚表地址赋值到对象中。比如如下类,构造函数里面根......
  • 指针函数与函数指针
    1.指针函数先看下面的函数声明,注意,此函数有返回值,返回值为int*,即返回值是指针类型的。1.int*f(inta,intb);上面的函数声明又可以写成如下形式:int*f(inta,intb);让指针标志*与int紧贴在一起,而与函数名f间隔开,这样看起来就明了些了,f是函数名,返回值类型是一个i......
  • 82.函数指针?
    82.函数指针?  函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如://比较两个string对象的长度boollengthCompare(conststring&,conststring&);  该函数的类型是bool(conststri......
  • C++内存模型&空指针、野指针、函数指针和回调函数
    C++内存模型&空指针、野指针、函数指针和回调函数C++内存模型栈与堆的区别:1.管理方式不同栈是系统自动管理的,在超出作用域后,将自动被释放堆是手动释放,若程序中不释放,程序结束后将由操作系统回收2.空间大小不同堆的大小受限于物理内存范围栈小的可怜,一般为8M(可通过更改......