第八部分多态.ppt
第八章:多态性,罗月童合肥工业大学,VCC研究室,导论,多态性(polymorphism):在程序中,同一符号或名字在不同情况下具有不同解释的现象称为多态性;C+中实现多态性的手段:函数重载;函数重定义,变色眼镜猫的瞳孔人的性格,虚函数祖先类指针指向后代类对象,目 录,8.1 导 论8.2 函数重载8.3 运算符重载8.4 虚函数8.5 抽象类8.6 多态性再讨论,8.2 函数重载(overloading),注意事项:返回值类型不能用于区分重载不同参数传递方式不能用于区分重载由typedef定义的类型不能用于区分重载函数重载的二义性:隐式类型转换引起的二义性使用缺省参数引起的二义性,目 录,8.1 导 论8.2 函数重载8.3 运算符重载8.4 虚函数8.5 抽象类8.6 多态性再讨论,8.3 运算符重载,8.3.1 导论8.3.2 运算符函数8.3.3 运算符重载,8.3.1 导 论,设计一个类表示复数,并实现加、减法运算,COMPLEX A,B,C;C=A.add(B);,8.3.1 导 论,运算符重载,8.3.2 运算符函数,运算符、函数都是接受参数、返回结果;运算符被视为函数的一种运算符函数;A+B-+(A,B)注意:C+仅允许重载一元、二元运算符;C+不允许重载三元运算符;,8.3.2 运算符重载,友元运算符重载,一个问题,类成员运算符重载,为什么只有一个参数?,运算符重载的其他规则,重载运算符无法改变任何运算符的优先级和结合性质重载运算符不可改变操作数的个数重载运算符不可使用缺省参数除了赋值运算符,重载运算符可由派生类继承;运算符=、()、-可作为类成员运算符,不可作为友元运算符;提议:保存运算符的含义,不要滥用!,重载赋值运算符“=”,重载赋值运算符“=”,目 录,8.1 导 论8.2 函数重载8.3 运算符重载8.4 虚函数8.5 抽象类8.6 多态性再讨论,8.4 虚函数,8.5.1 导 论8.5.2 虚函数的一般事宜8.5.3 静态邦定、动态邦定,8.5.1 导论,I am a member;I am a member;I am a member;,8.5.1 导论,I am a member;I am a TEACHER;I am a STUDENT;,8.5.2 虚函数的一般事宜,一般形式:virtual 返回值类型 函数名(形参列表)仅在类申明中添加关键字,在类实现中不需要添加;说明:如果函数在基类中是虚函数,派生类重定义时,即使不加“virtual”,该函数仍然是虚函数;,8.5.3 静态邦定、动态邦定,静态邦定:在编译阶段就能确定的邦定方式;动态邦定:在运行过程中才能确定的邦定方式;类继承、指针、虚函数配合实现,一般将析构函数定义为虚函数,Why?,题 目,请写一个程序满足:让用户输入10个图形(直线、或圆)的资料,然后将所有图形的资料显示出来;直线的信息:起点、终点圆 的 信 息:圆心、半径程序改进:其他要求不变,但图形种类增加了种类:椭圆椭 圆 的 信 息:圆心、大径、小径,目 录,8.1 导 论8.2 函数重载8.3 运算符重载8.4 虚函数8.5 抽象类8.6 多态性再讨论,8.5 抽象类,空函数体,派生类不重定义,Figure a;合法,但无意义,8.5 抽象类,纯虚函数:形式派生类必须重定义;抽象类:包含纯虚函数的类被称为纯虚类;不允许定义纯虚函数的对象;,纯虚类与抽象类的应用,CStack,目 录,8.1 导 论8.2 函数重载8.3 运算符重载8.4 虚函数8.5 抽象类8.6 多态性再讨论,8.6 多态性,在程序中同一符号或表示在不同情况下具有不同解释的现象称为多态性;编译是多态性(静态多态性):函数重载实现运行时多态性(动态多态性):虚函数、指针,