1运行时的多态性和抽象类2主要内容1.面向对象的重要特征:多态性2.运行时的多态性3.抽象类4.设计举例36.1面向对象的重要特征:多态性1.问题引入例子:①每年在加薪的时候,调用所有雇员的服务PayRaise(),包括行政人员。②行政人员的加薪计算应该与其余雇员不同。Employee(PayRaise())Executive46.1面向对象的重要特征:多态性2.面向对象技术使用什么样的机制处理?每当请求行政人员的该服务时,子类“行政人员”有一个代替雇员的PayRaise方法的方法。尽管这些方法是不同的,但它们完成相同的业务目的,把这种现象称为多态。所调用的方法依赖对象所属的类。56.1面向对象的重要特征:多态性3.多态性①多态性指同一个消息被不同类型的对象或相同类型的对象接收时产生不同的行为。①通俗地说,多态性是指用一个名字定义不同的函数,这些函数执行不同却类似的接口、多种方法。即用同样的接口访问功能不同的函数,从而实现多态性。66.1面向对象的重要特征:多态性4.多态性的分类①重载多态性:函数重载和运算符重载②继承多态性:派生类③参数多态性:模板④运行时的多态性:是包含多态性的动态体现⑤强制多态性:类型转换76.2运行时的多态性1.虚函数和运行时的多态性①基本概念虚函数C++语言中,前边标有关键字virtual的成员函数称做虚函数。C++语言实现运行时的多态性的方法是使用虚函数。动态绑定的标记是虚函数标记virtual。86.2运行时的多态性1.虚函数和运行时的多态性①基本概念运行时的多态性指对一个类层次来说,同样一个成员函数的调用,如果程序中动态确定的对象不同,则调用结果不同。指系统在运行时才具体确定对象所属类层次中的某个类,从而确定外部程序所发消息的匹配对象。运行时的多态性与类的继承和虚函数有关,虚函数允许函数调用与函数体之间的联系在运行时才建立,即所谓的“动态链接”。96.2运行时的多态性1.虚函数和运行时的多态性②虚函数的格式和使用方法在基类中声明虚函数的语句格式为:virtual成员函数原型;基类定义的虚函数在派生类中被覆盖虚函数在派生类中被覆盖,即保持函数原型不变,并且参数个数和参数类型完全相同。否则等同于普通函数的覆盖,就不能实现动态绑定,也就不能实现运行时的多态性。派生类覆盖时关键字virtual可以省略。106.2运行时的多态性1.虚函数和运行时的多态性③虚函数的使用方法设计一个类层次,并在类层次中定义一个或一个以上的虚函数。在外部程序中定义基类的指针。按照赋值兼容规则,程序中既可以把基类对象的地址(或指针值)赋给基类的指针,也可以把派生类对象的地址赋给基类的指针。116.2运行时的多态性1.虚函数和运行时的多态性③虚函数的使用方法当外部程序发送的消息是虚函数时,若此时基类指针指向基类的对象时,系统就调用基类中的成员函数;若此时基类指针指向派生类对象时,系统就调用派生类中的成员函数。如果没有按照上述2)的方法在程序中动态改变基类的指针,则系统将按静态绑定方式调用基类的成员函数。126.2运行时的多态性1.虚函数和运行时的多态性例:Aa,*pa;Bb;pa=&a;pa->print();//pa指向基类对象a,输出Apa=&b;pa->print();//pa指向派生类对象b,输出BclassA{public:virtualprint(){cout<<“A”;}};classB:publicA{public:print(){cout<<“B”;}};?若print()非虚函数,输出结果?136.2运行时的多态性1.虚函数和运行时的多态性例:虚函数举例,计算三角形、矩形和圆的面积。classfigure{protected:doublex,y;public:figure(doublea,doubleb):x(a),y(b){}virtualvoidshow_area(){cout<<"Noareadefined"<