第4章 类多态性.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 类多态性

第4章 类的多态性 一、虚函数 1、概述 通俗地讲,多态是指具有相似功能的不同函数使用同一个名称来表示,从而可以使用相同的调用方式调用具有不同功能的同名函数。 抽象地讲,多态是指同样的消息被不同类型的对象接收时导致完全不同的行为。 分类: (1)重载多态:普通函数、类的成员函数的重载 (2)包含多态:基类和派生类中同名成员函数问题,虚函数 (3)参数多态:函数和类的模板,通过不同实际参数的类型实例化,得到不同数据类型的相同操作。 成员函数重载: 在子类中可以重新定义成员函数。如果增加一个与基类成员函数同名的成员函数,但函数的形式参数个数、类型、次序不同,则编译程序可以完全识别确定。 虚函数: 如子类中定义的成员函数的原型与父类中的函数完全相同,采用同名覆盖或者虚函数来解决,用虚函数时系统编译不能完全确定。 例、基类/派生类中有相同的成员函数 class stu { public: … float cal( ); … }; class graduatestu :public stu { public: … float cal( ); … }; class stu { public: … float cal( ); … }; class graduatestu :public stu { public: … float cal( ); … }; 2、虚函数 在一个类中用保留字virtual定义的成员函数,称为虚函数。 class base {public: virtual void f( ) {coutIn base.\n;} }; class subcla: public base { public : [virtual ] void f( ) {coutIn suncla.\n;} }; class subclb: public base { public : [virtual ] void f( ) {coutIn sunclb.\n;} }; 3,虚函数的使用 class member {public: virtual void answer() {coutI am a member.\n;} }; class teacher : public member {public: [virtual] void answer() {coutI am a teacher.\n;} }; class student : public member {public : [virtual] void answer() {coutI am a student.\n;} }; 4、注意事项 (1)虚函数是成员函数,也只有成员函数才能说明成虚函数 (2)内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置 (3)构造函数不能是虚函数,但可以调用虚函数 (4)析构函数可以是虚函数: 声明语法: virtual ~类名(){ …… } 例如: class B {public: …… virtual ~B() { ……} }; 一旦基类的析构函数被声明为虚函数,所有派生类的析构函数自动变成虚函数 5、虚函数与构造/析构函数 构造函数中调用虚函数时,采用静态联编。即构造函数调用的虚函数是自己类中实现的虚函数。如自己类中没有实现这个虚函数,则调用基类中的虚函数,而不是任何派生类中的虚函数。 析构函数中调用虚函数的规则一样。 例,构造函数中用虚函数 class A { public : A( ){} virtual void f( ) {coutA::f() called.\n;} }; class B: public A { public : B( ) { f( );} void g( ) { f( );} //可以显式调用,如 B::f( ) virtual void f( ) {coutB::f( ) called.\n;} }; class C :public B { public: C( ) {} virtual void f( ) {coutC::f() called.\n;} }; 二、纯虚函数和抽象类 纯虚函数是一种特殊的虚函数,它的一般格式: class 类名 { virtual 类型函数名(参数表)=0; …… }; 在基类中声明但没有定义的虚函数。任何它的派生类都必须重新定义该函数。 抽象类: (1)一个类中至少有一个纯虚函数,则称为“抽象类”。 (2)一个特殊的类,为了抽象

文档评论(0)

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

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

1亿VIP精品文档

相关文档