How does a pet speak ?How does a pet speak ?void main()How does a pet speak ?How does a pet speak ?Pet pet,*p1;//基类对象指针pl,基类对象petDog dog 1;Cat cat1;//用Dog类对象给Pet类对象赋值pet = dog1;pet.speak();p1=&cat1;//用Cat类对象地址给基类指针赋值p1->speak();//用Dog类对象地址给基类指针赋值p1=&dog1;p1->speak();Pet &pet2= cat1;//以Cat类对象初始化Pet类引用pet2 .speak();派生类对象替代基类对象后,只能当做基类对象来使用。注不论派生类是否存在同名覆盖成员,基类对象访问的成员只能来自基类
void main() { Pet pet, *p1; //基类对象指针p1, 基类对象pet Dog dog1; Cat cat1; pet = dog1; //用Dog类对象给Pet类对象赋值 pet.speak(); p1 = &cat1; //用Cat类对象地址给基类指针赋值 p1->speak(); p1 = &dog1; //用Dog类对象地址给基类指针赋值 p1->speak(); Pet &pet2 = cat1; //以Cat类对象初始化Pet类引用 pet2 .speak(); } 派生类对象替代基类对象后,只能当做基类对象来使用。 不论派生类是否存在同名覆盖成员,基类对象访问的成员 只能来自基类。 注
17.1.2多态性例17-2:C++允许子类成员函数重载基类成员函数classclassGraduateStudent:public StudentStudent1public:public :/ /./ /..fioatcalcTuition()float calcTuition()1(//计算学费;/ /.若派生类没有定义.....calcTuition()才会:调用基类的。T:void main()(Student s;GraduateStudent gs;S.calcTuition();//调用Student::calcTuition()gs.calcTuition();//调用GraduateStudent::calcTuition()
例17-2:C++允许子类成员函数重载基类成员函数 class GraduateStudent : public Student { public : //. float calcTuition( ) { //. } } ; void main( ) { Student s ; GraduateStudent gs ; s . calcTuition( ) ; //调用Student:: calcTuition( ) gs . calcTuition( ) ; //调用GraduateStudent:: calcTuition( ) } class Student { public : //. float calcTuition( ) { //计算学费 ; //. } } ; 若派生类没有定义 calcTuition( )才会 调用基类的
17.1.2多态性例17-3:碰到对象所属的类不能确定的情况。classGraduateStudent:publicStudentclass Student1Ypublic :public :1 /.../1.floatcalcTuition()float calcTuition()//计算学费;I....:void fn(Student &x){x. calcTuition() ;1
例17-3:碰到对象所属的类不能确定的情况。 class GraduateStudent : public Student { public : //. float calcTuition( ) { //. } } ; void fn(Student & x) { x . calcTuition( ) ; } class Student { public : //. float calcTuition( ) { //计算学费 ; //. } } ;
2多态性17.1.2void main(){Student s;GraduateStudent gs ;fn(s) ;//计算大学生s的学费fn(gs) ;//计算研究生gs的学费因为大学生和研究生都是大学生。所以要求函数fn()的形参应该能接纳这两种对象这是继承机制的起码要求
void main( ) { Student s ; GraduateStudent gs ; fn(s) ; // 计算大学生s的学费 fn(gs) ; //计算研究生gs的学费 } • 因为大学生和研究生都是大学生。 • 所以要求函数fn( )的形参应该能接纳这两种对象。 • 这是继承机制的起码要求
17.1.2多态性但是函数fn()有一个问题:以fn(s)调用时,形参x为Student对象。x.calcTuition()则指Student::calcTuition()。以fn(gs)调用时,形参x为GraduateStudent对象。x.calcTuition()则是GraduateStudent::calcTuition()。函数调用的实际参数,随应用程序的运行而改变,要求函数fn()的行为也要随着变更。这样,函数fn()的运行执行代码就无法在编译时被确定
• 但是函数fn( )有一个问题: ✓ 以fn(s)调用时,形参x为Student对象。 ✓ x . calcTuition( )则指Student::calcTuition()。 ✓ 以fn(gs)调用时,形参x为GraduateStudent对象。 ✓ x.calcTuition( )则是GraduateStudent::calcTuition()。 ✓ 函数调用的实际参数,随应用程序的运行而改变, 要求函数fn( )的行为也要随着变更。 ✓ 这样,函数fn( )的运行执行代码就无法在编译时被确 定