二、C++概述
4、面向对象的设计
扩展类的实现:1、必须提供自己的实例;2、必须提供实际的操作函数;3、必须提供自己的构造函数。【基类的构造函数无法被派生类继承,派生类的构造函数提供了向基类构造函数传递参数的接口】
inline IntArrayRC::IntArrayRC( int sz)
: IntArray( sz ) {}
inline IntArrayRC::IntArrayRC( const int *iar, int sz )
: IntArray( iar, sz ) {}
在冒号后面是派生类向基类传参的接口。这样传参的构造函数不需要提供显式的析构函数,因为在派生类没有引入需要析构的成员,析构函数可以通过基类的析构函数解决。
C++支持多继承【继承多个类】和虚拟继承【继承派生类】。
Q1:一般来说 类型 / 子类型继承关系反映了一种 is-a 的关系:具有范围检查 功能的 ArrayRC 是一种 Array; 一本书 Book 是一种图书外借资源 LibraryRentalMaterial; 有声书 AudioBook 是一种书 Book; 等等。下面哪些反映出这种 is-a 关系?(a)成员函数是一种(isA_kindOf) 函数(b)成员函数是一种类(c)构造函数是一种成员函数(d)飞机是一种交通工具(e)摩托车是一种卡车(f)圆形是一种几何图形(g)正方形是一种矩形(h)汽车是一种飞机(i)借阅者是一种图书馆(a)(c)(d)(f)(g)Q2:判断以下操作哪些可能是类型相关的,因此可把它们定义为虚拟函数?哪些可以在所有类之间共享?对单个基类或派生类来说哪些是惟一的?(a) rotate(); (b) print();(c) size(); (d) dateBorrowed();(e) rewind(); (f) borrower();(g) is_late(); (h) is_on_loan();都可能是类型相关的,都可以共享,都可以是惟一的???Q3:对于 protected 访问级别的使用已经有了一些争论。有人认为 使用保护访问级 别允许派生类直接访问基类的成员,这破坏了封装的概念,因此,所有的基类实现细节都应 该是私有的 private。 另外一些人认为,如果派生类不能直接访问基类的成员,那么派生 类的实现将无法有足够的效率供用户使用。如果没有关键字 protected, 类的设计者将被迫把 基类成员设置为 public。 你怎样认为?我认为两者都有道理,看具体的需求。Q4:第二个争论是关于将成员函数显式地声明为 virtual 的必要性。一些人认为,这意味着如果类的设计者没有意识到一个函数需要被声明为 virtual, 则派生类的设计者就没有办法改写 这个关键函数。因此,他们建议把所有成员函数都设置为 virtual 的。另一方面,虚拟函数比 非虚拟函数的效率要低一些 。 因为它们不能被内联,内联发生在编译时刻,而虚拟函数是 在运行时刻被处理的。 所以它们可能是运行时刻效率低下的原因之一。尤其是小巧而又被 频繁调用的与类型无关的函数,比如 Array 数组的 size 函数。你又怎样认为呢?我认为显式声明是有必要的,这样可以更加灵活去改派生类的内容,也能够使一些功能单一但是需要调用很多次的函数可以内联。
5、泛型设计