C++学习笔记14 V-Tables && 虚继承
2017-09-12 21:18
281 查看
很感谢这位博主,写的很棒, C++ 虚函数表解析
这位博主针对无覆盖继承、有覆盖继承、多继承等等讲的很细致。
还有这一篇C++ 多继承和虚继承的内存布局 技术点满满。这一篇讲的更加详细。
还有这一篇关于内存布局讲的很清楚c++对象内存布局
这一篇写了较多的关于继承的sixeof的问题,写的不错,
C++ 深入理解 虚继承、多重继承和直接继承
对于虚继承简单来说就如下图:
注意一定要结合这三个博客一起学习,很棒的总结
存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。
一个类存在虚函数,那么编译器就会为这个类生成一个虚表,在虚表里存放的是这个类所有虚函数的地址。当生成类对象的时候,编译器会自动的将类对象的前四个字节设置为虚表的地址,而这四个字节就可以看作是一个指向虚表的指针。虚表里依次存放的是虚函数的地址,每个虚函数的地址占4个字节。
1虚函数表是全局共享的元素,即全局仅有一个.
2.虚函数表类似一个数组,内部放的是指向类的虚函数的函数指针,不是程序代码,不肯能存储在代码段.
3.虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不再堆中.
根据以上特征,虚函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定.
所以我推测虚函数表和静态成员变量一样,存放在全局数据区.
c/c++程序所占用的内存一共分为五种:
栈区,堆区,程序代码区,全局数据区(静态区),文字常量区.
显而易见,虚函数表存放在全局数据区.
另外
虚函数表是class specific的,也就是针对一个类来说的,这里有点像一个类里面的staic成员变量,即它是属于一个类所有对象的,不是属于某一个对象特有的,是一个类所有对象共有的。
虚函数表是编译器来选择实现的,编译器的种类不同,可能实现方式不一样,就像前面我们说的vptr在一个对象的最前面,但是也有其他实现方式,不过目前gcc 和微软的编译器都是将vptr放在对象内存布局的最前面。
这位博主针对无覆盖继承、有覆盖继承、多继承等等讲的很细致。
还有这一篇C++ 多继承和虚继承的内存布局 技术点满满。这一篇讲的更加详细。
还有这一篇关于内存布局讲的很清楚c++对象内存布局
这一篇写了较多的关于继承的sixeof的问题,写的不错,
C++ 深入理解 虚继承、多重继承和直接继承
对于虚继承简单来说就如下图:
注意一定要结合这三个博客一起学习,很棒的总结
虚表在哪里
C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。
一个类存在虚函数,那么编译器就会为这个类生成一个虚表,在虚表里存放的是这个类所有虚函数的地址。当生成类对象的时候,编译器会自动的将类对象的前四个字节设置为虚表的地址,而这四个字节就可以看作是一个指向虚表的指针。虚表里依次存放的是虚函数的地址,每个虚函数的地址占4个字节。
1虚函数表是全局共享的元素,即全局仅有一个.
2.虚函数表类似一个数组,内部放的是指向类的虚函数的函数指针,不是程序代码,不肯能存储在代码段.
3.虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不再堆中.
根据以上特征,虚函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定.
所以我推测虚函数表和静态成员变量一样,存放在全局数据区.
c/c++程序所占用的内存一共分为五种:
栈区,堆区,程序代码区,全局数据区(静态区),文字常量区.
显而易见,虚函数表存放在全局数据区.
另外
虚函数表是class specific的,也就是针对一个类来说的,这里有点像一个类里面的staic成员变量,即它是属于一个类所有对象的,不是属于某一个对象特有的,是一个类所有对象共有的。
虚函数表是编译器来选择实现的,编译器的种类不同,可能实现方式不一样,就像前面我们说的vptr在一个对象的最前面,但是也有其他实现方式,不过目前gcc 和微软的编译器都是将vptr放在对象内存布局的最前面。
相关文章推荐
- C++学习笔记(第14章->代码重用->包含,继承,多重继承,虚基类)
- C++学习笔记-多重继承&虚拟继承
- 【C++】学习笔记草稿版14(继承与派生)
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)
- C++学习笔记(第13章->类继承)
- effective C++ 学习笔记 实现&&继承与面向对象设计
- <C++学习笔记一>——多继承
- C++之多态与继承学习笔记
- c&c++反汇编与逆向分析学习笔记(4)--启动函数和用户入口
- Java学习笔记11 面向对象之继承与…
- 【学习笔记】day1_快速入门 14_电话拨号器定义布局&获取组件对象
- C++学习笔记(第9章->内存模型和名称空间)
- C++学习笔记4-----类的继承基础概念
- C++学习笔记:继承中的构造与析构
- [C++] Modern C++ Design(MCD)学习笔记 && 测试代码
- 人工智障学习笔记——机器学习(14)mds&isomap降维
- c++学习笔记(14.函数模板)
- C++学习笔记——继承与派生(二)