二、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、泛型设计
本文介绍了C++中面向对象设计的关键概念,包括类的继承机制(包括扩展类实现、构造函数和析构函数)、is-a关系的体现、虚拟函数的使用以及泛型设计的讨论,强调了封装和效率之间的权衡。
1003

被折叠的 条评论
为什么被折叠?



