C++——多态实现原理分析
前言
虚函数执行速度要稍慢一些。为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也是间接实现。所以多态性总是要付出一定代价,但通用性是一个更高的目标。
实验环境
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++——多态实现原理分析相关推荐
- C++多态的原理(虚函数指针和虚函数表)
C++多态的原理 (虚函数指针和虚函数表) 1.虚函数指针和虚函数表 2.继承中的虚函数表 2.1单继承中的虚函数表 2.2多继承中的虚函数表 3.多态的原理 4.总结 1.虚函数指针和虚函数表 以下 ...
- hidl 原理分析_AIDL原理分析
季春初始,天气返暖,新冠渐去,正值学习好时机.在Android系统中,AIDL一直在Framework和应用层上扮演着很重要的角色,今日且将其原理简单分析.(文2020.03.30) 一.开篇介绍 1 ...
- C++中虚析构函数的作用及其原理分析
参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢. 一.虚析构函数的作用 ...
- C++中的多态——理解虚函数表及多态实现原理
多态及其实现原理 一.多态的概念 概念 构成条件 二.虚函数的重写 重写的定义 重写的特殊情况 override和final关键字 区分重写.重载.重定义 抽象类的概念 三.多态的实现原理 父类对象模 ...
- [java] 反射和多态实现原理详解以及对比
Table of Contents 反射和多态 多态 什么是多态 java里多态的具体用法 多态的实现原理 反射 什么是反射 反射的实现原理 反射的应用 反射的弊端 反射相关类 反射应用实例 一些问题 ...
- java signature 性能_Java常见bean mapper的性能及原理分析
背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...
- Select函数实现原理分析
转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...
- spring ioc原理分析
spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...
- 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...
最新文章
- 不同命名空间的对象二进制反序列化问题
- 分析与设计(AD)简介(2)
- vs怎么设置php文件调试,使用vs code编辑调试php配置的方法
- php随机数字总和固定,php 随机生成固定长度整数、各种服务器请求方法
- Cpp 对象模型探索 / placement new 实现原理
- VTK:几何对象之PolyLine
- NET问答: 说说你对 LookupTKey, TElement 的看法 ?
- Platform.Uno介绍
- apache camel_探索Apache Camel Core –文件组件
- 第六课 从词向量到NLP分类问题
- Ubuntu学习小结(一) 基础知识,系统安装,软件安装,解压缩
- 2018年全国多校算法寒假训练营练习比赛(第一场)D. N阶汉诺塔变形(找规律)
- hive内部表与外部表入门
- 巧用 TypeScript(四)
- duilib 中list控件的扩展
- c语言设计通讯录设计报告,C语言通讯录课程设计报告--设计一个通讯录管理系统...
- Yii路由之LimeSurvey去掉烦人的/index.php/*
- Smart3D飞控地方坐标系
- STM32网络通信之DM9000了解
- 当A题成为一种习惯--POJ AC100题纪念贴