C++课件邱志杰第四章继承与派生.pptVIP

  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文档。上传文档
查看更多
* * 保护派生类 class 派生类名 : protected 基类名{ ……//派生类新添加的成员 }; 基类的成员在保护派生类中的引用权限 基类 公有成员 私有成员 保护成员 保护派生类 保护成员 不可访问成员 保护成员 * * 小结 不同的继承方式,子类对基类中的成员的访问权限如下表所示: 基类 公有成员 私有成员 保护成员 公有派生类 公有成员 不可访问成员 保护成员 保护派生类 保护成员 不可访问成员 保护成员 私有派生类 私有成员 不可访问成员 私有成员 * * 注意 在派生类中重载虚函数时必须与基类中的函数原型相同,否则该函数将丢失虚特性。 函数原型不同,仅函数名相同。C++编译器认为这是一般的函数重载,此时虚特性丢失。 仅返回类型不同,其他相同。C++编译器认为这种情况是不允许的。 * * 虚函数如何体现动态绑定的特性? class Base{ public: virtual void Print(){ coutI am Base\n; }; }; class Derived:public Base{ public: void Print(){ coutI am Derived\n; }; }; void main() { Base base, *p; Derived derived; int condition; cincondition; if(1==condition) p=base; else p=derived; p-Print(); } 只有运行时才能确定调用的是“谁”的Print。 p的初始化依赖于condition的值 p的初始化依赖于condition的值 condition的值依赖于程序运行起来后用户的输入 * * 提供虚函数的意义 提升软件的重用性 基类使用虚函数提供一个接口,但派生类可以定义自己的实现版本。 虚函数调用的解释依赖于它的对象类型,这就实现了“一个接口,多种语义”的概念。 提高软件架构的合理性 * * class Base{ public: virtual void Print(){ coutI am Base\n; }; }; class Derived:public Base{ public: void Print(){ coutI am Derived\n; }; }; void main() { Base *p; p-Print(); } 主程序中只需要写上“p-Print()” Base base, Derived derived; int condition; cincondition; if(1==condition) p=base; else p=derived; 对p的初始化可以放在另一模块中完成 * * 虚函数的实现机制 函数指针回顾 int add(int a, int b) { return a+b; } int sub(int a, int b) { return a-b; } void main() { int (*pfunction)(int ,int); int ret; pfunction=add; ret=pfunction(5,3); pfunction=sub; ret=pfunction(6,3); } * * 虚函数表和虚指针 在编译时,为每个有虚函数的类建立一张虚函数表VTABLE,表中存放的是每一个虚函数的指针;同时用一个虚指针VPTR指向这张表的入口。 访问某个虚函数时,不是直接找到那个函数的地址,而是通过VPTR间接查到它的地址。 VPTR fun1 fun2 … funN VTABLE * * Base b; Base* bp = b; bp-Print(); bp 对象的内存空间除了保存数据成员外,还保存VPTR。VPTR由构造函数来初始化。 VPTR BASE::Print data members Base的对象 VTABLE VPTR Derived::Print data members Derived的对象 VTABLE Derived d; Base* bp = d; bp-Print(); * * 对虚函数的要求 虚函数必须是类的非静态成员函数。 不能将虚函数说明为全局函数。 不能将虚函数说明为静态成员函数。 不能将虚函数说明为友元函数。 本质的原因就是非静态成员函数隐含传递this指针,而通过this指针能够找到VPTR。 * * 在成员函数中调用虚函数 在一个基类或派生类的成员函数中,可以直接调用类等级中的虚函数。此时

文档评论(0)

开心农场 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档