随笔分类 - 深度探索C++对象模型
摘要:C++对象模型何为C++对象模型?C++对象模型可以概括为以下2部分:1.语言中直接支持面向对象程序设计的部分2.对于各种支持的底层实现机制语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等,这也是组里其他同学之前分享过的内容。第一部分这里我...
阅读全文
摘要:昨天笔试遇到个 关于类占用的空间大小的问题,以前没怎么重视,回来做个试验,还真发现了问题,以后各位笔试考官门,出题时请注明是用什么编译器。 vc6/vc8 cl 和 Dev-C 的g++ 来做的测试:上代码,测试代码:#include class A{public:int x; int y;A(){...
阅读全文
摘要:重复继承下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。下图是一个继承图,我们重载了父类的f()函数。其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还有自己的虚函数,自己overwrite父类的虚函数。如...
阅读全文
摘要:前言07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是...
阅读全文
摘要:下面来看看虚基类对对象内存布局的影响。虚基类的主要作用就是在所有的派生类中,保留且仅保留一份虚基类的suboject。#include using namespace std;class Base{public: int m_base; Base():m_base(20){} vi...
阅读全文
摘要:下面来看看虚基类对对象内存布局的影响。虚基类的主要作用就是在所有的派生类中,保留且仅保留一份虚基类的suboject。a. 一个虚基类的情况#include using namespace std;class Base{public: int base_member;};class Deriv...
阅读全文
摘要:注意:关于内存对齐(memory alignment),请看关于内存对齐问题,后面将会用到。下面我们进行在普通继承(即非虚继承)时,派生类的指针转换到基类指针的情形研究。假定各类之间的关系如下图:代码如下:#include using namespace std;class Parent{publi...
阅读全文
摘要:在对象内存布局 (9)基础上做些修改:派生类override基类的虚函数,即Base2 override Base1中声明的虚函数vfBase1(),Base3 override Base1中声明的虚函数vfBase1()和Base2中声明的虚函数vfBase2(), Derived overrid...
阅读全文
摘要:假定多层继承的各类之间的关系如下图。假定派生类不override基类的虚函数,即Base2不override Base1中声明的虚函数vfBase1(),Base3不override Base2中声明的虚函数vfBase2(),Derived不override Base3中声明的虚函数vfBase3...
阅读全文
摘要:在内存对象布局 (5)的代码中,在Derived类中将三个基类中的虚函数分别覆盖一个,即分别覆盖Base1中声明的vfBase1_1(),Base2中声明的vfBase2_1()以及Base3中声明的vfBase3_1()。保持其他代码不变,修改后的Derived代码如下:#include usin...
阅读全文
摘要:在对象内存布局 (5)的代码中,在Derived类中覆盖Base1中声明的vfBase1_1(),其他代码不变。修改后的代码如下:#include using namespace std;class Base1{public: int m_base1; inline virtual vo...
阅读全文
摘要:如果在对象内存布局 (5)的代码中,将Base1中的两个虚函数声明删除,同时将main函数中的下面代码注释掉(因为现在只有两张虚函数表了):代码如下:#include using namespace std;class Base1{public: int m_base1; /*inlin...
阅读全文
摘要:内容概要:满足下面3个条件时,1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数2. 非虚继承3. 多重继承类对象之内存布局多重继承,派生类不重写基类中的虚函数。假定各类之间的关系如下图:代码如下:#include using namespace std;class Base...
阅读全文
摘要:内容概要:满足下面2个条件时,1. 父类有虚函数,子类也有虚函数,且子类的虚函数重写或覆盖了父类的虚函数2. 非虚继承类对象之内存布局在前面的例子中,恢复原来的两个虚函数vfBase_1()和vfBase_2(),同时在Derived类中重写基类的虚函数vfBase_1(),Base类和Derive...
阅读全文
摘要:内容概要:满足下面2个条件时,1. 父类无虚函数,子类有虚函数2. 非虚继承类对象之内存布局如果将Base中的两个虚函数删除,情况有会怎么样呢?将Base中的两个虚函数删除,其他保持不变。Base类和Derived类两者之间的关系如下:代码如下:#include using namespace st...
阅读全文
摘要:内容概要:满足下面2个条件时,1. 父类有虚函数,子类也有虚函数,但子类并没有重写或覆盖父类的虚函数2. 非虚继承类对象之内存布局如果在Derived类中增加一个下面的虚函数,会怎么样呢?Base类和Derived类之间的关系如下:新加入的虚函数定义如下:#include using namespa...
阅读全文
摘要:内容概要:满足下面2个条件时,1. 父类有虚函数,子类无虚函数(即无虚函数重写或无虚函数覆盖)2. 非虚继承类对象之内存布局前述相关内容参考:1.http://blog.csdn.net/pathuang68/archive/2009/04/20/4096088.aspx2.http://blog....
阅读全文

浙公网安备 33010602011771号