目录

虚函数的实质——虚函数表

虚函数表是什么?

虚函数表长什么样?

证明了确实存在隐藏的虚函数表指针

派生类指针转换为基类类型的实质

当基类指针指向派生类对象时,虚函数表会如何变化?


虚函数的实质——虚函数表

虚函数表是什么?

虚函数表实质上就是静态指针数组,里面存储着每个成员函数的地址。

虚函数表长什么样?

这里除了父类Base中仅成员函数Func2没被声明为虚函数是从基类中继承过来的其他的成员函数全部将父类的同名成员函数替换。

虚函数表中存着每个成员函数的真实地址,比如当我们在父类中声明虚函数时,派生类的相应同名函数体的将其屏蔽替换。此时,派生类虚函数表中的这个函数它的地址是本类中新声明的函数地址,并不是基类同名函数的地址。如果我们不在父类中声明虚函数,派生类的成员函数是从基类中继承过来的,此时虚函数表中存储的函数地址是基类中的函数地址。

证明了确实存在隐藏的虚函数表指针

代码示例:

#include <iostream>
#include <string>
using namespace std;  class Cstudent
{
private:  string name;  float mark;
public:  Cstudent(string name, float mark)  {  this->name = name;  this->mark = mark;  }  ~Cstudent()  {  cout << "调用Cstudent的析构函数" << endl;  }  virtual void ShowInf() // 虚函数表指针占用4个字节存储内存  {  cout << this->name << "的成绩为" << this->mark << "分" << endl;  }
};  class CTemplatestudent
{
private:  string name;  float mark;
public:  CTemplatestudent(string name, float mark)  {  this->name = name;  this->mark = mark;  }  ~CTemplatestudent()  {  cout << "调用Cstudent的析构函数" << endl;  }  void ShowInf()  {  cout << this->name << "的成绩为" << this->mark << "分" << endl;  }
};  int main()
{  cout << "Cstudent所占用的空间为" << sizeof(Cstudent) << endl; // 结果为36=32+4  cout << "CTemplatestudent所占用的空间为" << sizeof(CTemplatestudent) << endl; // 结果为32
}  

派生类指针转换为基类类型的实质

指针指向的起始地址并不随数据类型的变化而变化,但是它指向的有效区域确随着数据类型的变化而变化。

在此例中,基类指针只指向派生类从基类中继承的东西(不考虑virtual时),因此指针里面的地址并不重要,重要的是指针的类型和对象的类型,这两个因素决定了指针指向的有效区域。

当基类指针指向派生类对象时,虚函数表会如何变化?

基类指针智慧指向派生类对象中与基类成员函数同名的函数,因为虚函数表只会把与基类成员函数同名的函数地址传进来。

虚函数的实质——虚函数表相关推荐

  1. 虚函数原理与虚函数表

    目录 一. 虚函数 二.虚函数原理与虚函数表 一. 虚函数 虚函数: 使用 virtual 关键字声明的函数,是动态多态实现的基础. 非类的成员函数不能定义为虚函数. 类的静态成员函数不能定义为虚函数 ...

  2. 虚函数和纯虚函数及虚函数表

    虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入 ...

  3. C++多态的原理(虚函数指针和虚函数表)

    C++多态的原理 (虚函数指针和虚函数表) 1.虚函数指针和虚函数表 2.继承中的虚函数表 2.1单继承中的虚函数表 2.2多继承中的虚函数表 3.多态的原理 4.总结 1.虚函数指针和虚函数表 以下 ...

  4. 虚函数与纯虚函数以及虚函数表之间的关系

    1.虚函数 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.C++中虚函数的作用主要是实现多态机制.所谓多态就是用父类指针指向子类对象,然后通过父类指针调用实际子类的成员函数,这种技术 ...

  5. C++中虚继承产生的虚基类指针和虚基类表,虚函数产生的虚函数指针和虚函数表

    本博客主要通过查看类的内容的变化,深入探讨有关虚指针和虚表的问题. 一.虚继承产生的虚基类表指针和虚基类表 如下代码:写一个棱形继承,父类Base,子类Son1和Son2虚继承Base,又来一个类Gr ...

  6. c++中虚函数和纯虚函数定义

    只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声 ...

  7. C++中的虚函数与纯虚函数

    文章目录 1 C++中的虚函数 1.1 虚函数 1.2 单个类的虚函数表 1.3 使用继承的虚函数表 1.4 多重继承的虚函数表 2 C++中的纯虚函数 1 C++中的虚函数 1.1 虚函数 虚函数的 ...

  8. 虚函数、纯虚函数、虚函数与析构函数

    一.虚函数 只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个 ...

  9. C++ 多态性之虚函数抽象类纯虚函数

    一. 虚函数 1.什么是虚函数:虚函数的定义是在基类中进行的,被 virtual 修饰的,当基类中的某个成员函数被声明为"虚函数"后,可以在一个或多个派生类中重新定义该函数,重新定 ...

最新文章

  1. C#下用P2P技术实现点对点聊天
  2. Embarcadero Dev C++ 中文输出乱码
  3. Android之自定义标题
  4. .NET设计模式(15):结构型模式专题总结
  5. 卷积网络的学习(卷积核,通道,padding,stride等概念)
  6. tensorflow学习笔记:tf.data.Dataset,from_tensor_slices(),shuffle(),batch()的用法
  7. 教你玩转CSS 媒体类型
  8. junit与spring-data-redis 版本对应成功的
  9. RoseHA集群:RHEL+RoseMirror+Oracle【2】
  10. linux添加nginx,linux下安装Nginx1.16.0的教程详解
  11. 原理 rpm_图文详解,微型直流电机的工作原理
  12. netdev_priv
  13. 韩顺平 Java IO流 自学笔记
  14. 2022年华为杯研究生数学建模竞赛ABCDEF题思路资料汇总贴
  15. RF 无法连接到服务器,这可能由于连接的服务不存在,TCP 错误代码 10061
  16. globk命令帮助信息
  17. 神工鬼斧惟肖惟妙,M1 mac系统深度学习框架Pytorch的二次元动漫动画风格迁移滤镜AnimeGANv2+Ffmpeg(图片+视频)快速实践
  18. deepin关机卡桌面_有了MyDock,我也有了一个MacBook桌面
  19. 官场直升机 鸿蒙笔著,担当:老衲笔尖无墨水,要从空处想鸿蒙
  20. SCP、NFS、TFTP的配置

热门文章

  1. DZ 系统维护工具箱Tools
  2. pdf阅读工具使用提醒
  3. BICC协议(简介)
  4. 加入域时提示“不能访问网络位置” 域
  5. VMware 17 Pro安装(升级)
  6. oracle查询当前时间前10分钟到当前时间的数据
  7. batch批处理小记
  8. ubuntu12.04将tgz文件解压到指定目录
  9. Laravel使用swagger PHP生成api接口文档
  10. Tomcat两个项目,一个可以正常访问,另一个报错404