C++程序设计第8章13.ppt

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

8.6 多态性与虚函数 使用基类引用去指向不同对象,同样可实现运行时多态性。 void Calfun(Student ps,char *str,int hour){ ps.SetCourse(str,hour); ps.Calculate(); ps.Print(); } int main(){ Student s; GradeStudent g; cout本科生:; Calfun(s,物理,80); cout研究生:; Calfun(g,“物理”,80); } 【例8.7】计算学分,基类与派生类定义同【例8.6】(基类派生类函数不变),增加函数: 几点提示: 5.虚函数重构不同于重载。派生类中定义虚函数必须与基类中的虚函数同名外,还必须同参数表,同返回类型。否则被认为是重载,而不是虚函数。 1.实现动态多态性需要三个条件:派生类体系、虚函数、指针或引用。 2.析构函数可定义为虚函数,构造函数不能定义虚函数。在基类及其派生类都有动态分配的内存空间时,应当考虑把析构函数定义为虚函数,以便能够用基类指针实现撤消对象的多态性。 3. 虚函数执行速度稍慢。为了实现多态性,每一个派生类中均要保存相应虚函数的入口地址表,函数的调用机制也与一般函数不同。这是多态性为实现通用性付出的代价。 4. 静态成员函数不能作为虚函数,因为它不属于某个对象,而是为所有同类对象共有。内联函数也不能作为虚函数。 声明虚函数的成员函数主要考虑以下几点: 首先看成员函数所在的类是否会作为基类。然后看成 员函数在类的继承后有无可能被更改功能,如果希望更改 其功能的,一般应该将它声明为虚函数。 (2) 如果成员函数在类被继承后功能不需修改,或派生类 用不到该函数,则不要把它声明为虚函数。 (3) 应考虑对成员函数的调用是通过对象名还是通过基类 指针或引用去访问,如果是通过基类指针或引用去访问 的,则应当声明为虚函数。 虚析构函数 如果用new运算符建立了临时对象,若基类中有析构 函数,并且定义了一个指向该基类的指针变量。在程序用 带指针参数的delete运算符撤销对象时,会出现: 系统会 只执行基类的析构函数,而不执行派生类的析构函数。 解决办法: 把析构函数定义为虚函数,实现撤消对象时的多态性。 当程序使用多态性并且为不同的类分配内存时,应该 使用虚析构函数来保证内存按照需要被释放。 虚析构函数声明: virtual ~类名( ); class A{ public: ~A(){ coutA析构\n; } }; class B:public A{ public: B(); ~B(); private: int *p; }; B::B(){ p=new int(); } B::~B(){ coutB析构\n; delete p; } void fun(A *a){ delete a; } int main(){ A *a=new B; //a是指向基类的指针变量指向new开辟的动态存储空间 fun(a); return 0; } 输出:A析构 virtual 输出:B析构 A析构 把基类的析构函数声明为虚函数。可使所有派生类的 析构函数自动成为虚函数(即使函数名不同)。若程序中 显式地用了delete运算符准备删除一个对象,而delete运算 符的操作对象用了指向派生类对象的基类指针,系统会调 用相应类的析构函数。 1. 虚函数是动态关联的基础。 2. 虚函数是非静态的成员函数。 3. virtual 只用来说明类声明中的原型,不能用在函数实 现时。 4. 具有继承性,基类中声明了虚函数,派生类中无论是 否说明,同原型函数都自动为虚函数。 5. 不是重载声明而是覆盖。 6. 通过基类指针或引用,执行时会根据指针指向的对象 的类,决定调用哪个函数。 class shape{ public: shape(char*name,int x,int y); virtual void draw(); ~shape(); protected: char name[64]; int x,y; }; class circle:public shape{ public: circle(char*name,int x,int y,int radius); void draw(); ~circl

文档评论(0)

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

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

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档