前言

虚函数执行速度要稍慢一些。为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现。所以多态性总是要付出一定代价,但通用性是一个更高的目标。

实验环境

Windows10 企业版

Visual Studio2017 15.8.1

引入虚函数后内存大小变

没有虚函数时类占用内存大小

#include<iostream>
using namespace std;class Base
{
public:Base(){cout << "Create Base" << endl;}~Base(){cout << "Free Base" << endl;}
public:void Show(){cout << "This is Base Show()" << endl;}
private:int x;
};void main()
{cout << sizeof(Base) << endl;Base b;
}

View Code

占用内存为4字节。在x86 模式下,整形变量大小为4字节

有虚函数时类占用内存大小

#include<iostream>
using namespace std;class Base
{
public:Base(){cout << "Create Base" << endl;}~Base(){cout << "Free Base" << endl;}
public:virtual void Show(){cout << "This is Base Show()" << endl;}
private:int x;
};void main()
{cout << sizeof(Base) << endl;Base b;
}

View Code

占用内存为8字节。在x86 模式下,整形变量大小为4字节。剩下4字节是虚函数表指针,指针变量在x86下占内存大小4字节。

代码中只定义了一个虚函数,定义多个虚函数,类的大小还是8。虚函数表的指针指向的是虚函数表的入口地址

虚函数表

 1 #include<iostream>
 2 using namespace std;
 3
 4 class Base
 5 {
 6 public:
 7     Base()
 8     {
 9         cout << "Create Base" << endl;
10     }
11      ~Base()
12     {
13         cout << "Free Base" << endl;
14     }
15 public:
16     virtual void Show()
17     {
18         cout << "This is Base Show()" << endl;
19     }
20     virtual void Print()
21     {
22         cout << "This is Base Print()" << endl;
23     }
24     void Fun()
25     {
26         cout << "This is Base Fun()" << endl;
27     }
28 private:
29     int x;
30 };
31
32 class D :public  Base
33 {
34 public:
35     D()
36     {}
37     ~D()
38     {}
39 public:
40     void Show()
41     {
42         cout << "This is D Show()" << endl;
43     }
44     void Fun()
45     {
46         cout << "This is D Fun()" << endl;
47     }
48     virtual void List()
49     {
50         cout << "This is D List()" << endl;
51     }
52 private:
53     int y;
54 };
55
56 void main()
57 {
58     D d;
59 }

View Code

虚函数表前后变化

虚函数表在构造父类的时候会记录所有父类的虚函数

这里面少显示了子类的List虚方法,少显示是编译器的问题。但是你不能通过父类指针访问子类List()方法,因为List超出了父类范围。

子类构造完成后,子类重写了父类的虚函数,虚函数表中的虚函。数就变成了子类的。狸猫混太子,偷梁换柱的意思

转载于:https://www.cnblogs.com/kelamoyujuzhen/p/9551717.html

C++——多态实现原理分析相关推荐

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

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

  2. hidl 原理分析_AIDL原理分析

    季春初始,天气返暖,新冠渐去,正值学习好时机.在Android系统中,AIDL一直在Framework和应用层上扮演着很重要的角色,今日且将其原理简单分析.(文2020.03.30) 一.开篇介绍 1 ...

  3. C++中虚析构函数的作用及其原理分析

    参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢. 一.虚析构函数的作用 ...

  4. C++中的多态——理解虚函数表及多态实现原理

    多态及其实现原理 一.多态的概念 概念 构成条件 二.虚函数的重写 重写的定义 重写的特殊情况 override和final关键字 区分重写.重载.重定义 抽象类的概念 三.多态的实现原理 父类对象模 ...

  5. [java] 反射和多态实现原理详解以及对比

    Table of Contents 反射和多态 多态 什么是多态 java里多态的具体用法 多态的实现原理 反射 什么是反射 反射的实现原理 反射的应用 反射的弊端 反射相关类 反射应用实例 一些问题 ...

  6. java signature 性能_Java常见bean mapper的性能及原理分析

    背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...

  7. Select函数实现原理分析

    转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...

  8. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  9. 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...

最新文章

  1. 不同命名空间的对象二进制反序列化问题
  2. 分析与设计(AD)简介(2)
  3. vs怎么设置php文件调试,使用vs code编辑调试php配置的方法
  4. php随机数字总和固定,php 随机生成固定长度整数、各种服务器请求方法
  5. Cpp 对象模型探索 / placement new 实现原理
  6. VTK:几何对象之PolyLine
  7. NET问答: 说说你对 LookupTKey, TElement 的看法 ?
  8. Platform.Uno介绍
  9. apache camel_探索Apache Camel Core –文件组件
  10. 第六课 从词向量到NLP分类问题
  11. Ubuntu学习小结(一) 基础知识,系统安装,软件安装,解压缩
  12. 2018年全国多校算法寒假训练营练习比赛(第一场)D. N阶汉诺塔变形(找规律)
  13. hive内部表与外部表入门
  14. 巧用 TypeScript(四)
  15. duilib 中list控件的扩展
  16. c语言设计通讯录设计报告,C语言通讯录课程设计报告--设计一个通讯录管理系统...
  17. Yii路由之LimeSurvey去掉烦人的/index.php/*
  18. Smart3D飞控地方坐标系
  19. STM32网络通信之DM9000了解
  20. 当A题成为一种习惯--POJ AC100题纪念贴

热门文章

  1. python3创建一个游戏窗口
  2. 安装ROS环境时的常见问题及解决办法
  3. Message-Digest Algorithm 5
  4. oracle中实现continue,break .
  5. python3 重新学习
  6. 35-面试:如何找出字符串的字典序全排列的第N种
  7. Java数据结构习题_算法分析
  8. NormalMap 贴图 [转]
  9. 关于重复接收NSNotificationCenter发送的通知的问题
  10. step2 . day7 C语言阶段小的项目总结