实验八虚函数及应用.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验八虚函数及应用 —、实验目的 理解虚函数与运行时(动态)多态性之间的关系,掌握虚函数的定义及应用; 理解纯虚函数与抽彖类的概念,掌握抽彖类的定义及应用; 理解虚析构函数的概念及作用。 二、实验学时 课内实验:2课时 课外练习:2课时 三本实验涉及的新知识 ㈠虚函数与动态多态性 在C++屮,如果将基类与派生类的同名成员函数定义为虚函数,就可以定义一个基类指 针,当基类指针指向基类对象时访问基类的成员函数,当基类指针指向派生类对象时访问派 生类的成员函数,实现在运行吋根据基类指针所指向的对象动态调用成员函数,实现动态多 态性。换句话说,虚函数与派生类相结合,使C++能支持运行时(动态)多态性,实现在基 类中定义派生类所拥有的通用“接口”,而在派生类中定义具体的实现方法,即“一个接口, 多种方法”。 ㈡虚函数的定义 在基类中定义 在定义函数的前面加上“virtual ”。即: virtual返回类型函数名(参数表) 在派生类中定义 函数的返回类型、函数名、参数的个数、参数类型及顺序必须与基类中的原型完全相同。 说明: (1) 在派生类中定义虚函数时,可用“virtual”也可不用virtual(最好都使用)。 (2) 虚函数在派生类屮重新定义时,其原型必须与基类屮相同。 (3) 必须用基类指针访问虚函数才能实现运行时(动态)多态性;当用普通成员函数的 调用方法(即用圆点运算符)调用虚函数时,为静态调用; (4) 屜函数在自身类屮必须声明为成员函数(不能为友元函数或静态成员函数),但在另 一个类中可以声明为友元函数。 (5) 虚函数可以公有继承多次,其虚函数的特性不变。 (6) 构造函数不能定义为虚函数,但析构函数可以定义为虚函数。 (7) 虚函数与重载函数的关系 普通函数重载是通过参数类型或参数的个数不同实现的;重载一个虚函数时,其函 数原型(返冋类型、参数个数、类型及顺序)完全相同。 当重载的虚函数只有返回类型不同时,系统将给出错误信息;如果定义的虚函数只 有函数名相同,而参数个数或类型不同时,则为普通函数重载。 ㈢纯虚函数与抽象类 纯虚函数定义 格式: virtual返回类型func_name(参数表)=0; [{……}] 抽象类 抽象类的概念 当一个类中定义了一个或多个纯虚函数,则该类称为抽象类。 说明: 抽象类中包含没有功能的纯虚函数,用来提供派生类的公共接口函数。因此,抽象 类只能作为其它类的基类,不能定义其对象。 可以定义抽象类的指针或引用,用于指向派生类而实现多态性。 如果在派生类屮未重新定义纯虚函数,则派生类只是继承了基类的纯虚函数,这时, 派生类仍是抽象类。 ㈣虚析构函数 虚析构函数的定义 在析构函数名前加上“virtual”。即: virtual ~ 类名(void) {……} 说明 当类中需要显式定义析构函数,而在基类中定义了虚函数吋,应将析构函数定义为虚析 构函数,以实现动态调用析构函数。 四、实验内容 ㈠验证及认知实验 按要求调试下列程序,并冋答相关问题。 程序 1 (exp_801 .cpp) #inelude iostream.h class Base { int a,b; public : Base(int xjnt y) {a=x;b=y;) void show() { cout? a=,?a?H b=H?b; } }; class Derived:public Base { int c; public: Derived(int x,int y,int z):Base(x,y) {c=z;} void show() { Base::show(); cout ?H c=n?c; } }; void main() {Base mb(50,50),*mp; Derived md( 10,20,30); mp二mb; mp-show(); cout?endl; mp=md; mp?show(); cout?endl; ((Derived*)mp)-show(); cout?endl; } 问题: 编译运行程序的输出结果为: 根据程序的输出结果可知: 执行 “mp=mb; mp-show();” 时,调用的是 类的 show(); 执行 “mp=md; mp-show();” 时,调用的是 类的 show(); 执行 “((De「ived*)mp)?show();” 时,调用的是 类的 show(): 其中“((Derived*)mp)”是将Base类“mp”指针强制转换为 类的指针。 在基类“Base”中的成员函数“void show()改为uvirtual void show(),再重新 编译运行程序,输出结果为: 当执行“mp二md; mp-show();”时,调用的是 类的 show();函数“

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档