17.2多态的思考方式C++的继承机制中用多态性技术可以解决这个问题。若语言不支持多态,则不能被称为面向对象的语言。例17-2的函数由于增加了研究生学费的计算操作calcTuition(),而呈现出多态性。如果处理该函数的计算机无法分瓣大学生和研究生的学费计算的不同,只能人为干预
• C++的继承机制中用多态性技术可以解决这 个问题。 • 若语言不支持多态,则不能被称为面向对象 的语言。 • 例17-2的函数由于增加了研究生学费的计算 操作calcTuition( ),而呈现出多态性。 • 如果处理该函数的计算机无法分辨大学生和 研究生的学费计算的不同,只能人为干预
17.2多态的思考方式例如,在Student类中增加一个type公共数据成员,来标识大学生和研究生,这样,普通函数就能访问这个公共数据成员。然后,根据这个标识来分别修改Student和GraduateStudent的构造函数对type成员赋初值,并在应用程序中,增加学生类别的判断,以便调用相应的学费计算操作
• 例如,在Student类中增加一个type公共数据 成员,来标识大学生和研究生。 • 这样,普通函数就能访问这个公共数据成员。 • 然后,根据这个标识来分别修改Student和 GraduateStudent的构造函数。 • 对type成员赋初值,并在应用程序中,增加 学生类别的判断,以便调用相应的学费计算 操作
17.2多态的思考方式增加标识。例17-4:StudentType(STUDENT,GRADUATESTUDENT1;enumclassStudentpublic :StudentType type;//说明为公共的,便于应用程序访问float calcTuition() ;Student( char * pName ="no name" )(strncpy(name, pName, sizeof(name)) ;average = semesterHours = 0;type = STUDENT ;//大学生类,标识STUDENT1:
例17-4:增加标识。 enum StudentType { STUDENT, GRADUATESTUDENT } ; class Student { public : StudentType type ; //说明为公共的,便于应用程序访问 float calcTuition( ) ; Student( char * pName = "no name" ) { strncpy(name, pName, sizeof(name) ) ; average = semesterHours = 0 ; type = STUDENT ; //大学生类,标识STUDENT } //. } ;
class GraduateStudent :public Studentpublic :GraduateStudent()YType=GRADUATESTUDENT;覆盖刚赋的STUDENT值float calcTuition() ;1:void fn(Student & s)11/ /.switch(s.type)//判断对象的type,以确定调用哪个学费计算成员[case STDENT:s.Student::calcTutition( ); break ;caSeGRADUATESTUDENT:static cast<GraduateStudent>(s).calcTutition();break;1类型转换原型:static_cast<new_type>(expression)
class GraduateStudent : public Student { public : GraduateStudent( ) { Type = GRADUATESTUDENT ; //覆盖刚赋的STUDENT值 } float calcTuition( ) ; //. } ; void fn(Student & s) { //. switch(s . type) //判断对象的type,以确定调用哪个学费计算成员 { case STDENT: s.Student::calcTutition( ); break ; case GRADUATESTUDENT: static_cast<GraduateStudent>(s).calcTutition( ) ; break ; } } 类型转换原型:static_cast< new_type >(expression)
17.2多态的思考方式如果有多个这种多态的成员,每个都要进行类似的处理再加上继承机制派生出的新类,会导致应用程序的维护量过大而且,类的内部实现和应用程序都要进行修改。导致面向对象的优越性被遏制,回到了面向过程程序设计上去了
• 如果有多个这种多态的成员,每个都要进行 类似的处理。 • 再加上继承机制派生出的新类,会导致应用 程序的维护量过大。 • 而且,类的内部实现和应用程序都要进行修 改。 • 导致面向对象的优越性被遏制,回到了面向 过程程序设计上去了