【2021年9月2日 add】

C++中, 一旦某个成员函数在基类中声明为虚函数,则它在所有的子类中都会成为虚函数。
换言之,如果基类中已经声明了某个函数为虚函数,则无需在子类中使用关键字virtual再去声明函数。

当我们在派生类中覆盖了某个虚函数时,可以再一次使用virtual关键字指出该函数的性质。然而这么做并非必须,因为一旦某个函数被声明为虚函数,则在所有派生类中都是虚函数。--C++ Primer


【2021年9月8日 add】


因为指针长度的原因,例子里用的int型指针,这里运行例子的时候选择32位,否则不会是期望输出。

#include <iostream>
using namespace std;class Base1 {
public:virtual void f() { cout << "Base1::f" << endl; }virtual void g() { cout << "Base1::g" << endl; }virtual void h() { cout << "Base1::h" << endl; }
};class Base2 {
public:virtual void f() { cout << "Base2::f" << endl; }virtual void g() { cout << "Base2::g" << endl; }virtual void h() { cout << "Base2::h" << endl; }
};class Base3 {
public:virtual void f() { cout << "Base3::f" << endl; }virtual void g() { cout << "Base3::g" << endl; }virtual void h() { cout << "Base3::h" << endl; }
};class Derive : public Base1, public Base2, public Base3 {
public:virtual void f() { cout << "Derive::f" << endl; }virtual void g1() { cout << "Derive::g1" << endl; }
};typedef void(*Fun)(void);//函数指针
//定义了一种FUN的类型,并定义这种类型为指向某种函数的指针,
//这种函数以一个int为参数并返回char类型。后面就可以像使用int, char一样使用FUN了。int main()
{Fun pFun = NULL;Derive d;int** pVtab = (int**)&d;cout << (void *)pVtab[0][0] << endl;//Base1's vtable//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+0);pFun = (Fun)pVtab[0][0];pFun();//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+1);pFun = (Fun)pVtab[0][1];pFun();//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+2);pFun = (Fun)pVtab[0][2];pFun();//Derive's vtable//pFun = (Fun)*((int*)*(int*)((int*)&d+0)+3);pFun = (Fun)pVtab[0][3];pFun();//The tail of the vtablepFun = (Fun)pVtab[0][4];cout << pFun << endl;//Base2's vtable//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+0);pFun = (Fun)pVtab[1][0];pFun();//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+1);pFun = (Fun)pVtab[1][1];pFun();pFun = (Fun)pVtab[1][2];pFun();//The tail of the vtablepFun = (Fun)pVtab[1][3];cout << pFun << endl;//Base3's vtable//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+0);pFun = (Fun)pVtab[2][0];pFun();//pFun = (Fun)*((int*)*(int*)((int*)&d+1)+1);pFun = (Fun)pVtab[2][1];pFun();pFun = (Fun)pVtab[2][2];pFun();//The tail of the vtablepFun = (Fun)pVtab[2][3];cout << pFun << endl;return 0;
}

虚函数和虚表指针的例子相关推荐

  1. C++ 虚函数和虚表

    几篇写的不错的文章,本文是整合了这几篇文章,感谢这些大佬 https://www.jianshu.com/p/00dc0d939119 https://www.cnblogs.com/hushpa/p ...

  2. 虚函数,虚表深度剖析

    面向对象,从单一的类开始说起. class A { private:int m_a;int m_b; }; 这个类中有两个成员变量,都是int类型,所以这个类在内存中占用多大的内存空间呢? sizeo ...

  3. C++——多态|虚函数|重写|虚表

    文章目录 1. 多态的概念 1.1 概念 2. 多态的定义及实现 2.1多态的构成条件 2.2 虚函数 2.3虚函数的重写 虚函数重写的三个例外: 2.4 普通调用和多态调用: 2.5 C++11 o ...

  4. C++_vptr与vtbl,虚函数与虚表

    C++_vptr与vtbl,虚函数与虚表 一:虚函数表指针(vptr)创建时机 vptr跟着对象走,所以对象什么时候创建出来,vptr就什么时候创建出来,也就是运行的时候. 当程序在编译期间,编译器会 ...

  5. 虚函数、虚表的生成,虚表的修改

    接上文. 虚函数.虚表在没有实例的情况下是无法从语法层面进行访问的. 那么其到底有没有生成呢? #include<iostream> using namespace std;class A ...

  6. 标准C++之运算符重载和虚表指针

    1 -> *运算符重载 //autoptr.cpp     #include<iostream> #include<string> using namespace std ...

  7. C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址

    C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址 讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当 ...

  8. c语言中什么函数可以作为虚函数,C++语言中的“虚函数”就像C语言中的指针,必须要弄懂的...

    上一节较为详细的讨论了C++语言中基类被派生类继承过程中的内存模型,尤其较为详细的分析了虚函数及其虚表.虚表指针在内存中是如何分布,如何存储的,这对于理解C++语言中的"动态绑定" ...

  9. C++虚函数表,虚表指针,内存分布

    虚函数表和内存分布那一块转载自:https://blog.twofei.com/496/ 虚函数效率转载自:https://www.cnblogs.com/rollenholt/articles/20 ...

最新文章

  1. teach and learn
  2. VTK:可视化算法之FindCellIntersections
  3. 为什么要写this在访问成员变量的时候_C++幕后故事(一) --对象模型this指针调整...
  4. Linux抓包工具tcpdump例子
  5. 编译文件出错fatal error: GL/glew.h: No such file or directory
  6. Linux 用户操作
  7. 正则表达式,js表单验证
  8. 关于下载excel 解析文件名乱码
  9. 硬盘扩容linux重新检查,Linux 无损扩容磁盘
  10. cad计算机土方软件,CAD土方工程量算量插件(土方工程量计算工具)V1.1 正式版
  11. 在Word中快速插入分隔线
  12. C#实现百度翻译API调用
  13. PS技巧分享,不容错过
  14. 这行代码好怪,再看一眼!聊聊在 Gitea 玩 Code Review
  15. Re-ID with Triplet Loss
  16. 调音台使用基础-增益结构与推子位置
  17. 低成本2.4G SOC(NYA054E)灯控遥控芯片方案-CI2454/CI2451
  18. Java(转型-多态-契约)
  19. JS之使用Echarts画出人际关系图
  20. 转换MP4后浏览器播放只有声音没有图像的问题

热门文章

  1. 一文讲清K8s如何改变美团的云基础设施
  2. CNN发展历史【从LeNet到DenseNet】
  3. POI--HSSFCellStyle类
  4. poj 2777 Count Color(线段树区区+染色问题)
  5. 《Android的设计与实现:卷I》迷你书
  6. 线程:synchronized方法
  7. 甲醛、苯、甲苯、二甲苯对人体健康的危害
  8. android相关论文,android
  9. 普通大学毕业后干啥_一名女孩从大学毕业后在机械行业干了十年,背后经历让人辛酸……...
  10. 信息学奥赛一本通 1127:图像旋转 | OpenJudge NOI 1.8 11:图像旋转