
1.C对象模型nonstatic data members被配置于每一个class object内static data members被存储在class object外static和nonstatic function members实现代码也存储在class object外对virtual functions:a. 每个class产生一堆指向virtual functions指针放在表格中表中每个条目指向该类型的一个虚函数代码实例的起始地址b. 每个class object被安插一个指针执行相关的virtual tablevptr的设定重置由每一个class的constructor/destructor/copy assignment自动完成每一个class所关联的type_info object也放在表格中c. 一个class object所需内存构成一般要有c.1. 其nonstatic data members的总和大小c.2. 加上由alignment的需求而填补上去的空间c.3. 加上为支持virtual而产生的负担2.注意点对一个包含虚表指针的类对象执行memset(obj, 0, sizeof(obj))存在把保存在类对象内的虚表指针设为0的风险3.虚拟继承下的类型尺寸class X{};class V1{inti2;virtualvoidfun(){}};class V2:public virtual V1{inti;virtualvoidfun2(){}};class V3:public V2,public virtual V1{public:inti;virtualvoidfun3(){}};类型尺寸a.sizeof(X)为1b.sizeof(V1)为16c.sizeof(V2)为32d.sizeof(V3)为32在C中当使用虚继承时类的内存布局会发生变化主要是为了处理多重继承时的公共基类子对象问题。虚继承通过在继承体系中引入一个共享的、指向公共基类子对象的指针通常称为虚基类指针或vptr来确保只有一个公共基类的实例存在于派生类中。针对上述(1).class X {}:X是一个空类但即使如此编译器通常也会为它分配至少一个字节的内存以区分不同的对象。这是为了确保两个不同类型的空对象在内存中占据不同的地址。若空类作为基类时其尺寸计算为0因为此时派生类非空类时类型实例至少有1个字节内存无需上述处理派生类也是空类时派生类实例整体占1字节即可(2). 虚拟继承上述虚拟继承下V1V2V3实例对象可能的内存布局上述是V1上述是V2上述是V34.C如何实现多态对含虚函数的class有且仅有一个virtual table每个table内含其对应之class object中所有active virtual functions函数实例的地址active virtual functions包括(1).class自身新定义或重载的虚函数(2). 继承自base class的虚函数一个实际例子class point{public:virtual~point(){}virtualvoidmult()0;virtualvoidy()[}virtualvoidz(){}private:intx;};x实例对象内存可能的布局示意图指向的虚表可能的构成示意class point2d:public point{public:virtual~point2d(){}virtualvoidy(){}virtualvoidmult(){}public:inty;};一个point2d实例可能的内存布局示意point2d可能的虚表构成在上述背景下通过基类point指针ptr调y()时(1). 依据实例对象起始地址容易定位到对象内虚表指针(2). 通过函数名易于定位到需表中表项位置这样就完成了多态调用5.多重继承下多态的一个可能实现说明struct Base1{ public: int a; virtual ~Base1(){} virtual SpeakClearly(){} };struct Base2{ public: int b; virtual ~Base2(){} virtual void mumble(){} virtual void clone(){} };内存布局略struct Derived : public Base1, public Base2{ public: int c; virtual ~Derived(){} virtual void clone(){} };这里一个Derived实例对象将含两个虚表指针单独继承下只有一个且每个Base1部分的虚表指针Base2部分的虚表指针所指向的虚表由基类虚函数派生类重载综合得到todo1.补充说明publicpublic virtual区别2.补充说明publicpublic virtual下包含虚表时多重继承下内存布局。