多态性和虚函数.ppt

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.2 向上类型转换 【例5-3】 有一个交通工具类vehicle,将它作为基类派生出汽车类motor_ vehicle ,再将汽车类motor_ vehicle 作为基类派生出小汽车类car和卡车类truck,声明这些类并定义一个虚函数用来显示各类信息。程序如下: #include iostream using namespace std; class vehicle //基类vehicle声明 {public: virtual void message() //虚成员函数 { coutvehicle message endl; } private: int wheels; //车轮个数 float weight; //车重 }; 5.2 向上类型转换 class motor_vehicle: public vehicle {public: void message() { cout motor_ vehicle message endl; } private: int passengers; //承载人数 }; class car: public motor_vehicle {public: void message(){ coutcar message endl;} private: float engine; //发动机的马力数 }; class truck: public motor_vehicle {public: void message(){cout truck message endl;} private: int loadpay ; //载重量 }; 5.2 向上类型转换 int main() { vehicle v,*p; motor_vehicle m; car c; truck t; p=v; p-message(); p=m; p-message(); p=c; p-message(); p=t; p-message(); return 0; } 5.4.1 虚函数的定义与使用 C++规定,如果在派生类中,没有用virtual显式地给出虚函数声明,这时系统就会遵循以下的规则来判断一个成员函数是不是虚函数: (1)该函数与基类的虚函数有相同的名称。 (2)该函数与基类的虚函数有相同的参数个数及相同的对应参数类型。 (3)该函数与基类的虚函数有相同的返回类型或者满足赋值兼容规则的指针、引用型的返回类型。 5.4.1 虚函数的定义与使用 说明: (1)通过定义虚函数来使用C++提供的多态性机制时,派生类应该从它的基类公用派生。之所以有这个要求,是因为我们是在赋值兼容规则的基础上来使用虚函数的,而赋值兼容规则成立的前提条件是派生类从其基类公用派生。 5.4.1 虚函数的定义与使用 说明: (2)必须首先在基类中定义虚函数。由于“基类”与“派生类”是相对的,因此,这项说明并不表明必须在类等级的最高层类中声明虚函数。在实际应用中,应该在类等级内需要具有动态多态性的几个层次中的最高层类内首先声明虚函数。 5.4.1 虚函数的定义与使用 说明: (3)在派生类对基类中声明的虚函数进行重新定义时,关键字virtual可以写也可以不写。但为了增强程序的可读性,最好在对派生类的虚函数进行重新定义时也加上关键字virtual。 如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。 5.4.1 虚函数的定义与使用 说明: (4)虽然使用对象名和点运算符的方式也可以调用虚函数,例如语句:c.message (); 可以调用虚函数car:: message () 。但是这种调用是在编译时进行的功能早绑定,它没有充分利用虚函数的特性。只有通过基类指针或引用访问虚函数时才能获得运行时的多态性。 5.4.1 虚函数的定义与使用 说明: (5)一个虚函数无论被公用继承多少次,它仍然保持其虚函数的特性。 (6)虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态成员函数,因为虚函数调用要靠特定的对象来决定该激活哪个函数。但是虚函数可以在另一个类中被声明为友元函数。 5.4.1 虚函数的定义与使用 说明: (7)内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时仍将其看作是非内联的。 5.4.1 虚函数的定义与使用 说明: (8)构造函数不能是虚函数。因为虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此

文档评论(0)

jyr0221 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档