网站大量收购独家精品文档,联系QQ:2885784924

面向对象程序设计语言C++-第7章虚函数和多态性.ppt

面向对象程序设计语言C++-第7章虚函数和多态性.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七章 虚函数和多态性 7.1 虚函数 * 第七章 虚函数和多态性 7.1 虚函数 一个成员函数什么时候需要声明为虚函数呢?主要考虑以下几点: 首先考虑成员函数所在的类是否会做为基类。然后看成员函数在类的继承后有无功能被修改?如果希望修改其功能,一般将它声明为虚函数。 还应当考虑对成员函数的调用是通过对象名还是基类指针或引用去访问。如果通过基类指针或引用去访问,则声明为虚函数。 如果希望通过基类指针或者引用访问派生类成员函数,但基类功能比较抽象或者不能确定功能,可以将基类定义为抽象类,即只定义函数名字,没有函数体,具体功能由派生类添加。 * 第七章 虚函数和多态性 7.1 虚函数 (2)虚特性 用虚函数实现运行时多态性的关键之处是,必须用指向基类的指针(或者引用)访问虚函数。尽管可以像调用其他成员函数那样显式地用对象名来调用一个虚函数,但只有在一个指向基类的指针(或者引用)访问虚函数时,运行时多态性才能实现。这时,称为函数具有虚特性。 * 第七章 虚函数和多态性 7.1 虚函数 基类函数具有虚特性的条件是: 在基类中,将该函数说明为虚(virtual)函数。这样可以在派生类中重新定义此函数,为它赋予新的功能,并能够方便调用。在类外定义虚函数时,不必再加virtual关键字。 定义基类的公有派生类; 在基类的公有派生类中原型一致地重载该虚函数; 定义指向基类的指针变量,它指向基类的公有派生类的对象(或定义基类的引用,它引用基类的公有派生类的对象)。 * 第七章 虚函数和多态性 7.1 虚函数 重载一个虚函数时,要求函数名、返回类型、参量个数、参数类型和顺序是完全相同的。如果不同,会产生什么情况呢? (1)仅仅返回类型不同,其余相同。C++认为这是错误的,因为仅仅返回类型不同的函数本质上是含糊的。 (2)函数原型不同,仅函数名相同,C++认为这是一般的函数重载,此时虚特性丢失。(例7-5) * 第七章 虚函数和多态性 7.1 虚函数 定义虚函数时需要注意: (1) 虚函数必须是类的成员函数。不能将虚函数说明为全局(非成员的)函数,也不能说明为静态成员函数。不能将友元说明为虚函数,但虚函数可以是另一个类的友元。 (2) 析构函数可以是虚函数,但构造函数不能为虚函数。 (3)一旦一个函数被说明为虚函数,不管经历了多少派生类层,都将保持其虚特性。 * 第七章 虚函数和多态性 7.1 虚函数 3.虚析构函数 请看这个例子: class base { public: base(){coutbase()endl;} ~base(){cout~base()endl;} }; class derived:public base { public: derived(){coutderived()endl;} ~derived(){cout~derived()endl;} }; * int main() { base *pb=new derived; delete pb; return 0; } 第七章 虚函数和多态性 7.1 虚函数 请问程序的输出是什么? * 程序的输出如下: base() derived(); ~base(); 构造函数base()和derived()都被调用了,但是析构函数只有~base()调用了。 第七章 虚函数和多态性 7.1 虚函数 原因很简单:基类指针只调用基类成员函数,不能够调用派生类成员函数,即使是析构函数也是如此。如果希望能够执行派生类的析构函数,则需要将基类的析构函数声明为虚析构函数: virtual ~base() {cout~base()endl;} 当基类的析构函数声明为虚函数时,无论指针指向的是同一类族中的哪一个对象,当对象撤销时,系统会采用动态关联,调用相应的析构函数,对该对象进行清理工作。 * 第七章 虚函数和多态性 7.2 纯虚函数和抽象类 基类往往表示一些抽象的概念。例如,shape是一个基类,它表示具有形状的东西,从shape可以派生出封闭图形和非封闭图形两个派生类。封闭图形又可以派生出椭圆形、多边形,…… 这个类等级的基类shape体现了一个抽象的概念,在shape中定义一个求面积的函数显然是无意义的,但可以将其说明为虚函数,提供各派生类一个公共的界面,并由各派生类提供求面积函数的各自版本。 * 第七章 虚函数和多态性 7.2 纯虚函数和抽象类 在这类情况下,基类的有些虚函数没有定义是很正常的,但是要求派生类必须重定义这些虚函数,以使派生类有意义。为此,C++ 引入了纯虚函数的概念。 纯虚函数是一个在基类中说明的虚函数,它在该基类中没有定义,要求任何派生类都必须定义自己的版本。为说明一纯虚函数,使用下列一般形式: virtual type func_na

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档