【深入探索c++对象模型】data语义学二
2014-07-07 13:50
218 查看
单一继承中,base class 和derived class的对象都是从相同的地址开始,其间差异只在于derived class比较大,用以容纳自己的nonstatic members。
若vptr放在class object的起始处,如果base class没有虚函数而derived class有,那么单一继承的上述机制就被打破,把一个derived object转换为其base类型,就需要编译器的介入,用于调整地址。
View Code
输出为0,4,8,12,16,20
取某个成员的地址,表示该成员在class object中的偏移量,c++要求同一个access level中的members在内存中的排列次序应该和其声明次序相同,vptr在vs2013中应该是放到对象的尾部了。
参考:
http://blog.csdn.net/littlehedgehog/article/details/5442430 http://blog.csdn.net/hyg0811/article/details/11951855# http://blog.csdn.net/wangqiulin123456/article/details/8059536
若vptr放在class object的起始处,如果base class没有虚函数而derived class有,那么单一继承的上述机制就被打破,把一个derived object转换为其base类型,就需要编译器的介入,用于调整地址。
class X { public: static void fun() { printf("%d\n", &X::a); printf("%d\n", &X::b); printf("%d\n", &X::m); printf("%d\n", &X::n); printf("%d\n", &X::x); printf("%d\n", &X::y); } int a; int b; protected: int m; int n; private: int x; int y; }; int main() { X::fun(); system("pause"); return 0; }
View Code
输出为0,4,8,12,16,20
取某个成员的地址,表示该成员在class object中的偏移量,c++要求同一个access level中的members在内存中的排列次序应该和其声明次序相同,vptr在vs2013中应该是放到对象的尾部了。
参考:
http://blog.csdn.net/littlehedgehog/article/details/5442430 http://blog.csdn.net/hyg0811/article/details/11951855# http://blog.csdn.net/wangqiulin123456/article/details/8059536
相关文章推荐
- [读书笔记] 深入探索C++对象模型-第三章 Data语义学(上)
- [读书笔记] 深入探索C++对象模型-第三章 Data语义学(下)
- [读书笔记] 深入探索C++对象模型-第三章 Data语义学(中)
- 深入探索C++对象模型笔记之三 —— 构造函数语意学 (Default Constructor的建构操作)
- 《深入探索C++对象模型》第六章 执行语意学
- 《深入探索C++对象模型》读后感
- 深入探索C++对象模型笔记一 —— 关于对象(上)
- 【深入探索c++对象模型】类对象所需内存大小讨论
- 【深入探索c++对象模型】抽象类和纯虚函数的理解
- 深入探索C++对象模型 第七章 站在对象模型的尖端
- 【深入探索c++对象模型】c++中构造函数调用虚函数的讨论
- 深入探索C++对象模型 读书笔记(1)
- 深入探索C++对象模型(6)
- 深入探索c++对象模型
- 深入探索C++对象模型 第一章 关于对象
- 深入探索C++对象模型笔记之五 —— 构造函数语意学 (成员们的初始化队伍 Member Initialization List)
- 深入探索C++对象模型--详解深拷贝与浅拷贝以及拷贝构造的建构
- 深入探索C++对象模型(1)
- 深入探索C++对象模型(1)
- 深入探索C++对象模型(1) 关于对象(思维导图)