1.3 对象的差异

1.    C++ 程序设计模型直接支持三种程序设计典范(programming paradigms)

(1)程序模型(procedural model)

如字符串的处理,可用使用字符数组,及 str* 函数集。

(2)抽象数据类型模型(abstract data type model)

该模型所谓的“抽象”适合一组表达式(pubic 接口)一起提供,而运算定义仍隐而未明。

(3)面向对象模型(object-oriented model)

此模型中有一些彼此相关的类型,通过一个抽象的 base class 被封装起来。


2.    注意

(1)以一种paradigm 写程序,有助于整体行为的良好稳固,而混用的话,可能带来让人惊吓的结果,特别在没有谨慎处理的情况下。

(2)案例分析

// base class object
Library thing1;

// derived class object
Book book;

// book 被裁剪了,定义的运用是 ADT paradigm
thing1 = book;

// 调用的是 Library::check_in()
thing1.check_in();

// 正确的做法,是 OO paradigm
Library &thing2 = book;

// 调用的是 Book::check_in()
thing2.check_in();

(3)可以直接或间接处理继承体系中的一个 base class object,但只有通过 pointer 或 reference 的间接处理,才支持 OO 程序设计所需的多态性质。

(4)原则上,被指定的 object 的真实类型在每一个特定执行点之前,是无法解析的,通过 pointer 或 reference 的操作才能完成。

(5)在 ADT paradigm 中程序员处理的是一个拥有固定而单一类型的实体,在编译时已经完全定义好了。

(6)案例分析

// px 或 rx 是 Library object 或 subtype
Library *px = retrieve_some_material();
Library &rx = *px;

// dx 只能是 Library object
Library dx = *px;


3.    C++以下列方法支持多态

(1)经由一组隐含的转化操作。

例如把一个 derived class 指针转化为一个指向 public bass type 的指针。

shape *ps = new circle();

(2)经由 virtual function 机制。

ps->rotate();

(3)经由 dynamic_cast 和 typeid 运算符。

circle *pc = dynamic_cast< circle* >(ps);


4.    需要多少内存才能够表现一个 class object

(1)nonstatic data members 的总大小。

(2)任何由于 alignment 的需求而填补 padding 的空间。

(3)为了支持 virtual 而由内部产生的任何额外负担。


5.    指针的类型(the type of a pointer)

(1)“指向不同类型的指针”间的差异,不在其指针表示法不同,也不在其内容不同,而是在其所寻址出来的 object 类型不同。

(2)“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小。

(3)一个类型为 void* 的指针只能够含有一个地址,而不能够通过它操作所指 object,因为不知道所涵盖的地址空间。

(4)cast 其实是一种编译器指令,大部分情况下并不改变一个指针所含的真正地址,只影响“被指出的内存的大小和内容”的解释方式。


6.    加上多态之后(adding polymorphism)

(1)pointer 或 reference 都只需要一个 word 的空间(32位机上是 4 bytes)。

(2)案例分析

// class Bear : public ZooAnimal
Bear b;

ZooAnimal *pz = &b;
Bear *pb = &b;

// virtual void rotate();  ZooAnimal::rotate
pz->rotate();

pz 的类型在编译时决定:

a.    固定的可用接口。pz 只能调用 ZooAnimal 的 public 接口。

b.    接口的 access level。

在每个执行点,pz 所指的 object 类型决定 rotate() 所调用的实体。

(3)一个 pointer 或 reference 之所以支持多态,是因为它们不会引发内存中任何“与类型有关的内存委托操作”,会受到改变的只是所指内存的“大小和内容的解释方式”。

(4)C++ 也支持具体的 ADT 程序风格,被称为 object_based(OB)。

a.    例如 String class,一种非多态的数据类型,可用展示封装的非多态形式,不支持类型的扩充。

b.    一个 OB 设计可能比一个对等的 OO 设计速度更快而且空间更紧凑,但比较没有弹性。速度快是因为所有函数引发操作都在编译时完成,对象构建起来时不需要设置 virtual 机制。空间紧凑是因为不需要为了支持 virtual 而需要的额外负荷。


你可能感兴趣的:(多态)