摘要:在前一篇,我们讨论了在多重继承情况下,具有虚函数的类的内存布局情况。本篇将进一步探索在多重虚拟继承情况下的内存布局情况。 在讨论多重虚拟继承前,我们先对《浅析GCC下C++多重继承 & 虚拟继承的对象内存布局》中的例子进行扩充。先看看带有虚函数的单一虚拟继承情况下类的内存布局。 先看例子:View Code 1 #include <iostream> 2 using namespace std; 3 4 class Top 5 { 6 public: 7 virtual void x(){cout << "top x" << en
阅读全文
摘要:上一篇我们讨论了在单一继承的情况下,具有虚函数的类对象的内存布局情况。本篇主要讨论在多继承情况下,对象的内存布局。 看例子:View Code 1 #include <iostream> 2 using namespace std; 3 4 class Left 5 { 6 public: 7 virtual void x(){cout << "left x" << endl;} 8 virtual void print1(){cout << "left print" << endl;} 9 p
阅读全文
摘要:在前一篇,我们讨论了在多继承情况下,具有虚函数的类的内存布局情况。本篇将进一步探索在多重继承,即具有重复继承的情况下的内存布局情况。在阅读本篇和下一篇之前,建议先阅读本博客另一篇博文《浅析GCC下C++多重继承 & 虚拟继承的对象内存布局》。 先说一点题外话,细心的读者可能会发现,我们在探索不同情况下类的内存布局时,总是先通过查看类的大小以及其中各个成员变量的地址来进行分析,然后再具体定位某一位置的值。从最原始的内存中的对象分布,我们可以获得最深入最有效的理解。 OK,请看例子:View Code 1 #include <iostream> 2 using namespac
阅读全文
摘要:上一篇,我们讨论了带有虚函数的对象的内存布局情况。这一篇,主要讨论带有虚函数的类在单一继承情况下的内存布局情况。 还是从例子入手:View Code 1 #include <iostream> 2 3 using namespace std; 4 5 class Point 6 { 7 public: 8 int x(); 9 virtual void y(){cout << "Point y" << endl;};10 virtual void print1(){cout << "Point print"
阅读全文
摘要:我们知道,虚函数作为C++实现多态的方式,具有强大的RTTI(RunTime Type Identification)功能。虚函数使用起来比较简单,但是也很容易出错。本系列将带着你一步一步了解虚函数的内部实现机制,在掌握原理后,我相信你会对虚函数以及C++本身会有进一步的认识和理解。 注:本系列所有的关于C++虚函数的探索都是在GCC平台上进行的。一、带有虚函数的对象内存布局 让我们先看一段代码:View Code 1 #include <iostream> 2 using namespace std; 3 4 class Test 5 { 6 public: 7 virtua..
阅读全文
摘要:继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局。一、多重继承 先看几个类的定义:View Code 1 class Top 2 { 3 public: 4 int a; 5 }; 6 7 class Left : public Top 8 { 9 public:10 int b;11 };12 13 class Right : public Top14 {15 public:16 int c;17 };18 19 cl...
阅读全文
摘要:一.头文件1)所有头文件都应该使用#define防止头文件被多重包含, 命名格式当是:<PROJECT>_<PATH>_<FILE>_H_ 例如, 项目foo中的头文件foo/src/bar/baz.h可按如下方式保护:#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_…#endif // FOO_BAR_BAZ_H_2)能用前置声明的地方尽量不使用 #include.减少代码的重新编译。3)只有当函数只有 10 行甚至更少时才将其定义为内联函数.4)复杂的内联函数的定义, 应放在后缀名为 -inl.h 的头文件中.5)
阅读全文