4.5.1 层次结构的益处
类层次结构的益处主要体现在两个方面:
·接口继承(Interface inheritance):派生类对象可以用在任何要求基类对象的地方。即,基类担当了派生类接口的角色。Container和Shape就是很好的例子,这样的类通常是抽象类。
·实现继承(Implementation inheritance):基类负责提供可以简化派生类实现的函数或数据。Smiley使用Circle的构造函数和Circle::draw()就是例子,这样的基类通常含有数据成员和构造函数。
具体类,尤其是表示简单的类,与内置类型非常相似:我们将其定义为局部变量,通过它们的名字访问它们,随意拷贝它们,等等。类层次中的类则有所区别:我们倾向于用new在自由存储中为其分配空间,然后通过指针或引用访问它们。例如,我们设计这样一个函数,它首先从输入流中读入描述形状的数据,然后构造对应的Shape对象:
程序使用该函数的方式如下所示:
显然,这个例子非常简单,尤其是并没有做任何错误处理,但它淋漓尽致地展示了user()完全不知道它操纵的是哪种形状。user()的代码只需编译一次,即可使用随后添加到程序中的新Shape。注意,在user()外没有任何指向这些形状的指针,因此user()应该负责释放掉它们。这项工作由delete运算符完成并且完全依赖于Shape的虚析构函数。因为该析构函数是虚函数,因此delete会调用最底层派生类的析构函数。这一点非常关键:因为派生类可能已经获取了很多资源(如文件句柄、锁、输出流等),这些资源都需要释放掉。此例中,Smiley释放了它的eyes和mouth对象。它一旦完成了这些工作,就继续调用Circle的析构函数。对象的构造是由构造函数“自顶向下的”进行的(基类优先),销毁则是由析构函数“自底向上”(派生类优先)进行的。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access

