图6.18类层次图程序如下:本程序的执行结果如下:圆桌属性数据:高度:0.6米桌面半径:0.5米面积:0.785平方米颜色:白色设计一个虚基类Person,包含姓名和年龄私有数据成员以及相关的成员函数,由它派生出领导类Leader,包含职务和部门私有数据成员以及相关的成员函数,再由Person派生出工程师类Engineer,包含职称和专业私有数据成员以及相关的成员函数,然后由Leader和Engineer类派生出主任工程师类Chairman。......
2023-11-07
在日常生活中,常用“是一种(is-a)”关系来组织与表达知识,从而将知识组织成一种有层次、可分类的结构。例如,本科生是学生,人是一种动物等。
这种层次结构的分类方法应用十分广泛,如交通工具有汽车、火车、飞机、轮船等,而汽车又分为卡车、旅行车、小汽车等,小汽车又包括工具车、轿车、面包车等。如图6.1所示。从图中可以看出,is-a关系是一种继承关系。
图6.1 汽车层次关系图
这个分类树反映了交通工具的继承与派生关系,最高层是抽象程度最高的,最具有普遍和一般意义的概念,下层具有了上层的特性,同时加入了自己的新特征,而最下层是最为具体的。在这个层次结构中,从上到下是一个具体化、特殊化的过程;由下到上,是一个抽象化的过程。
在理解这种层次关系时要注意几个概念,一种是类型,类型是个体的集合,图6.1中,火车、汽车、飞机、公共汽车等都是类型;另一种是个体,如206路公共汽车等。
在面向对象的程序设计中,类型表示为类,类与类之间通过继承关系组成的层次结构称为类层次。如果类B继承类A,就画一条箭头从类B的节点指向类A的节点,并且将父类放在上面,子类放在下面。
is-a关系和第2章介绍的has-a关系是类之间的基本关系,但两者是有区别的。如果类B继承类A,则B与A之间是一种is-a关系;如果类B的定义中将类A的对象作为数据成员,则B与A之间是一种has-a关系。
继承关系具有双重作用:(www.chuimin.cn)
(1)作为类的构造机制,继承通过扩充、组合现有的类来构造新的类。扩充是指形成现有类的特例——派生类,组合是指抽取出若干现有类的共性形成新的抽象层次——基类。
(2)作为类型的构造机制,如果类B继承类A,则所有要求对象A类型的地方也可以接受B类型的对象。正如,“公共汽车”是一种“汽车”,所有出现“汽车”的地方用“公共汽车”来代替是合理的,但反之不然,出现“公共汽车”的地方不一定能用“汽车”代替。
通过继承可对类分层,C++通过类的派生机制来支持继承。被继承的类称为基类、父类或超类,新的类为派生类或子类。
在派生过程中,派生出来的新类同样可以作为基类再继续派生出更新的类,依此类推形成一个层次结构。直接参与派生出某类称为直接基类,而基类的基类,以及更深层的基类称为间接基类。
继承反映了事物之间的联系,事物的共性与个性之间的关系。继承与独立设计类相比,前者工作量少,重复的部分可以从基类继承来,不需要单独编程实现代码复用。所以继承为程序代码的重用提供了重要的技术实现手段。
注意:第2章介绍了has-a关系,它表示“有一个对象”关系,而is-a表示“是一个对象”关系,要注意两者的差别,前者是一个组合关系,在这种关系中,一个类的对象拥有作为其成员的其他类的对象;后者是一种继承,派生类的对象也以作为基类的对象处理。
有关C++程序设计基础教程的文章
图6.18类层次图程序如下:本程序的执行结果如下:圆桌属性数据:高度:0.6米桌面半径:0.5米面积:0.785平方米颜色:白色设计一个虚基类Person,包含姓名和年龄私有数据成员以及相关的成员函数,由它派生出领导类Leader,包含职务和部门私有数据成员以及相关的成员函数,再由Person派生出工程师类Engineer,包含职称和专业私有数据成员以及相关的成员函数,然后由Leader和Engineer类派生出主任工程师类Chairman。......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
在C++中,数组和指针密切相关,几乎可以互相使用。数组名字可以认为是常量指针,它指向存放数组第一个元素的内存地址。指针可以用于完成任何涉及数组下标的操作。实际上,数组下标表示法在编译期间将转换为指针表示法,所以用指针方式来书写数组下标表达式可以节省编译时间。如果再定义一个字符指针:char*pname=name;则name[i]、*和*具有相同的值,都是数组第i+1个元素的值。分析以下程序的执行结果。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
在类声明中,public、private和protected是关键字,称为成员访问限定符,它们分别表示公有、私有和保护的成员访问权限。其他函数不能访问该类的保护数据成员,也不能调用该类的保护成员函数。◇一旦给出了成员访问限定符,它后面的成员都具有这个成员访问权限,直到出现另一个成员访问限定符或类声明结束为止。类的成员函数可以访问类的所有成员,没有任何限制,而类的对象对类的成员的访问是受成员访问控制符制约的。......
2023-11-07
C++的标准输入/输出流库用于数据的输入/输出,用于输入/输出的流库包含在头文件iostream.h中。表1.4常用的输入/输出流操纵符显示常数使用cout可以显示字符串和数字,并可显示多个值。因此,用户输入数据时要避免输入的数据超出指定变量的值域。程序的执行结果如下:注意:使用cin输入一个字符串时,其中不能含有空格,否则,cin认为输入结束。......
2023-11-07
多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。按照绑定进行阶段的不同,可以分为两种不同的绑定方法:静态绑定和动态绑定,这两种绑定过程中分别对应着多态的两种实现方式。有些多态类型,其同名操作的具体对象能够在编译、连接阶段确定,通过静态绑定解决,比如重载、强制和参数多态。包含多态操作对象的确定就是通过动态绑定完成的。分析以下程序的执行结果。......
2023-11-07
类的每一个成员函数都有一个隐含的特殊指针,通常称为this指针,this指针的类型就是成员函数所属的类型。通常不显式使用this指针。this指针是C++实现封装的一种机制,它将对象和该对象调用的成员函数连接在一起,在外部看来,每个对象都拥有自己的成员函数。this指针一般用于返回当前对象自身。程序的执行结果如下:s1∶n=2s2∶n=1s3∶n=3this指针大量用于运算符重载成员函数设计中,这将在后面详细介绍。......
2023-11-07
相关推荐