C++课件,从零开始概要1.ppt

C课件,从零开始概要1

C++程序设计教程(第二版) 第十二章 多态 Chapter 12 Polymorphism 多态性是面向对象程序设计的重要特征之一。 所谓多态性是指当不同的对象收到相同的消息时,产生不同的动作。 C++的多态性具体体现在运行和编译两个方面,在程序运行时的多态性通过继承和虚函数来体现,而在程序编译时多态性体现在函数和运算符的重载上。 第十章内容 1. 继承召唤多态 (Inheritance Summon up Polymorphism) 祖孙互易的说明: 晚辈是前辈的后继,晚辈是前辈的一种. 反之不确,前辈不是晚辈,也不是晚辈的一种. 这一概念也影响到类的继承操作,甚至其指针操作: Student是GraduateStudent的祖先.则: Student s, *pS; GraduateStudent gs, *pGS; s = gs; // ok gs = s; // error pS = static_castStudent*(gs); // ok pGS = static_castGraduateStudent*(s); // error 同化效应 class Student{ public: // . . . void display(){ cout“UnderGraduate\n”; } }; class GraduateStudent :public Student{ public: // . . . void display(){ cout“Graduate\n; } }; Student ds; GraduateStudent gs; ds.display(); gs.display(); 同化效应蔓延到指针操作 Student s, *ps; GraduateStudent gs; ps = s; ps-display(); ps = static_castStudent*(gs); ps-display(); 结果: UnderGraduate Graduate or UnderGraduate 关键技术 void fn(Student x){ x.diaplay();// ... } int main(){ Student s; GraduateStudent gs; fn(s); // 显示大学生信息 fn(gs); // 显示研究生信息 } 结果: UnderGraduate Graduate or UnderGraduate 2. 抽象编程的困惑 ( Abstract Programming Perplexing ) 类型域方案可以做到,即实现fn函数如下: void fn(Student x){ switch(x.type){ case Student::STUDENT: x.calcTuition(); break; case Student::GRADUATESTUDENT: GraduateStudent rx = static_castGraduateStudent(x); rx.calcTuition(); break; } } 但不敢恭维这种方法,因为它导致类编程与应用编程互相依赖,因而破坏了只关注局部细节的抽象编程. 破坏抽象编程的后果是: 可维护性,可扩展性受到伤害. 若增加一个博士类,则类代码与应用程序代码都得改,而这本来不是应用程序的份内事. 因而呼吁从语言内部来支持这种多态性. 3. 虚函数 ( Virtual Function ) 虚函数的概念 虚函数是在基类中冠以关键字 virtual 的成员函数。它提供了一种接口界面。虚函数可以在一个或多个派生类中被重定义。 在C++语言中,是通过将一个函数定义成虚函数来实现运行时的多态的。如果一个函数被定义为虚函数,那么,即使是使用指向基类对象的指针来调用该成员函数,C++也能保证所调用的是正确的特定于实际对象的成员函数。 如果类Derived由基类Base派生而来,Base有一个用virtual修饰的公有或保护函数成员f(),而在Derived中的一些类中重新定义了成员函数f(),而对f()的调用都是通过基类的对象或指针进行的,在程序执行时才决定是调用基类还是派调用生类中定义的f(),这样的函数f()称为虚函数。 一旦一个函数在基类中第一次声明时使用了virtual了关键字,那么,当派生类重载该成员函数时,无论是否使用了virtual 关键字,该成员函数都将被看作一个虚函数,也就是说,虚函数的重载函数仍是虚函数。 注意:在派

文档评论(0)

1亿VIP精品文档

相关文档