1. 简单的对象模型
简单对象模型名副其实,非常简单。 在简单对象模型中,一个槽由一系列槽组成。 每个槽相当于一个指针,指向一个,对应于声明顺序的槽,包括数据和。 如果将简单对象模型应用到Point Class,结构图如下:
2. 表驱动的对象模型
表驱动对象模型将数据和数据分别映射到两个表,即数据表和表,并且其本身仅存储指向这两个表的指针。 该表由一系列槽组成,每个槽指向一个; 数据表直接存储数据本身。 如果将表驱动对象模型应用于Point Class,则结构图如下:
3.C++对象模型
C++对象模型的早期设计是在简单对象模型的基础上进行了改进,针对内存空间和访问时间进行了优化。 主要是数据存储在每一个中,而数据和全部则独立存储在全部之外。 对虚拟功能的支持主要通过以下几点来完成:
如果将C++对象模型应用到Point Class,结构图如下:
具有继承性的对象模型
C++支持单继承、多重继承和虚拟继承。 我们来看看基类实体在类中是如何构造的。
在简单对象模型中,可以通过类中的槽来存储基类的地址,从而可以通过槽来访问基类的成员。 这种实现方式的主要缺点是:由于间接存储而导致空间和访问时间的额外负担; 优点是:类的结构不会因为基类的变化而改变。
在表驱动对象模型中,可以使用类似于基类表的表来存储所有基类信息。 该表存储了一系列槽,每个槽存储一个基类的地址。 这种实现方式的缺点是:由于间接存储,对空间和访问时间造成了额外的负担; 优点是:首先,所有继承的类都有一致的表示(包括指向基类Table的基表指针),与基类的大小和数量无关。 其次,基类表增加了子类的可扩展性。 当基类发生变化时,可以通过扩大、缩小、或者改变基类表来进行调整。
上述两种实现方式都有一个重要的问题,就是由于间接而带来了空间和时间的额外负担,而且间接的层次会随着继承的深度而增加。
C++最初采用的继承模型不使用任何间接寻址。 所有基类数据都直接存储在子类中,从存储结构和访问效率上来说都是最高效的。 当然,也有缺点:当基类有任何改变时,使用这个基类或类的对象必须重新编译。 C++ 2.0中引入了基类,需要一些间接方法来支持此功能。 通常,将导入基类表或扩展现有表。 详细信息将在稍后的博客文章中讨论。
点击链接领取信息,先到先得: