[读书笔记] 深入探索C++对象模型-第四章-Function语义学(中续)
2016-09-14 23:28
357 查看
继续整理函数调用的第三种情况内容,注:以下部分图片来自于原文
3. 虚拟继承情况下的虚函数调用:
如下例子,Point3d虚拟继承自Point2d:
此时的内存布局如下,注意此时虽然Point3d只有唯一一个基类(最左边的)Point2d,但是它们的布局并不像非虚拟继承的单一继承那样,二者之间不再相符,二者之间的转换也就需要调整this指针,因为此时Point3d中继承而来的Point2d子对象地址与Point3d并不一致(注:原书中下图的mumble()方法为Point3d,但实际上Point3d中,并未重写该方法,所以应该为Point2d):
虚拟继承带来了前所未有的复杂性,当一个虚基类从另一个虚基类继承而来时,并且两者都支持虚函数和非静态数据成员,此时编译器对于虚基类的支持就像进了迷宫一样,所以,对于虚基类,不要在其中声明非静态数据成员。
3. 虚拟继承情况下的虚函数调用:
如下例子,Point3d虚拟继承自Point2d:
此时的内存布局如下,注意此时虽然Point3d只有唯一一个基类(最左边的)Point2d,但是它们的布局并不像非虚拟继承的单一继承那样,二者之间不再相符,二者之间的转换也就需要调整this指针,因为此时Point3d中继承而来的Point2d子对象地址与Point3d并不一致(注:原书中下图的mumble()方法为Point3d,但实际上Point3d中,并未重写该方法,所以应该为Point2d):
虚拟继承带来了前所未有的复杂性,当一个虚基类从另一个虚基类继承而来时,并且两者都支持虚函数和非静态数据成员,此时编译器对于虚基类的支持就像进了迷宫一样,所以,对于虚基类,不要在其中声明非静态数据成员。
相关文章推荐
- 获取成员函数地址及获取函数地址
- 深度探索c++对象模型
- [读书笔记] 深入探索C++对象模型-第二章《构造函数语义学》(上)
- [读书笔记] 深入探索C++对象模型-第二章《构造函数语义学》(中)
- [读书笔记] 深入探索C++对象模型-第二章《构造函数语义学》(下)
- [读书笔记] 深入探索C++对象模型-第三章 Data语义学(中)
- [读书笔记] 深入探索C++对象模型-第三章 Data语义学(下)
- [读书笔记] 深入探索C++对象模型-第四章-Function语义学(上)
- [读书笔记] 深入探索C++对象模型-第四章-Function语义学(中)
- 1.1 C++对象模式
- 《深入探索C++对象模型》第四章:Function语意学
- 《深入探索C++对象模型》第三章:Data语意学
- 《深入探索C++对象模型》第二章:构造函数语意学(下)
- 《深入探索C++对象模型》第二章:构造函数语意学(上)
- 《深入探索C++对象模型》第一章:关于对象
- 《深度探索C++对象模型》读书笔记第七章:站在对象模型的尖端
- C++中空类和空结构体大小的问题?
- C++对象模型和多态
- [读书笔记] 深入探索C++对象模型-第七章-站在对象模型的尖端(上)
- [读书笔记] 深入探索C++对象模型-第六章-执行期语义学(下)