现在的位置: 首页 > 综合 > 正文

Inside the C++ Object Model阅读笔记:Chapter 1

2014年03月01日 ⁄ 综合 ⁄ 共 1071字 ⁄ 字号 评论关闭
Chapter 1 Object Lessons

1.1
几种对象模型:
1、简单对象模型:对象是一系列插槽(slot,Qt化了?!),每个插槽插入一个成员,按照声明顺序来定义。
2、表驱动模型:对象包含指向两个表的指针。成员函数表是一对插槽,每个插槽指向一个成员。数据表直接保存数据。
C++使用的模型:
对于每个类的虚函数,都生成了一个表(虚函数表)。每个对象都包含了指向这个虚表的指针(vptr)。指针由编译器维护。type_info也由虚表保存,一般是虚表的第一个插槽。

C++支持SI和MI。MI时可以选择虚继承(由virtual)关键字声明。虚继承时,基类只出现一次,不论继承链中出现了多少次基类。
C++采用最有效的方式来处理继承。基类的数据被直接存放到派生类对象中。这使得访问基类成员最有效,但是基类成员一旦改变,所有派生类都必须重新编译。

1.2
对于用户自己定义的类型,使用class。struct的默认成员是public而class的默认成员访问权限是private。
一个小的C Trick:
struct stumble
{
......
char pc[1];
}
使用的时候可以
struct stumble* S=(struct stumble*) malloc(sizeof(stumble)+strlen(string)+1);
strcpy(&(S->pc),string);
用来传递一个变长数组。
然而在C++情况下,如果前面用到了不是public的限定符,则会出现问题。
需要组合C的struct和C++的class,最好的方法是“组合”,而不是“继承”。

1.3
C++支持三种编程范式:
1、过程化编程
2、抽象数据类型编程
3、面向对象编程
C++支持下列类型的多态性
1、通过隐式转换将继承类转化为它的公有基类
2、通过虚函数机制
3、通过dynamic_cast和typeid
在具有虚函数的情况下,采用指针和引用访问的类型可以实现多态性,但是采用直接对象传递的方式则没有多态性,直接按照类型传递。
一个对象所消耗的内存:
总共的非静态数据+数据对称所消耗的空间+为支持虚表所消耗的空间
指针类型的不同体现在指向对象的类型的大小和组成之中。
对于派生类的指针和基类的指针的区别:基类指针指向的范围只有派生类对象中基类成分的范围。不通过抽象机制(注:应该是虚函数机制),基类指针无法访问派生类的对象的非基类部分。
不同类型的(派生类->基类)的对象复制时,虚表并不复制。当做出这样的复制时,只会复制给基类对象以派生类对象中基类成分的部分。
C++提供非继承的对象,这种对象没有抽象惩罚。

抱歉!评论已关闭.