C++第五章2).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文档。上传文档
查看更多
C第五章2)

不恰当的虚函数 如果虚函数在基类与子类中出现的仅仅是名字的相同,而参数类型不同,或返回类型不同,即使写上virtual,则不进行滞后联编. class Base { public: virtual void fn(int x) { cout“Base fn(int)”endl; } } 例外 class Base { public: virtual Base fn(int x) { return Base() ; } } 错误写法 静态成员变量 class Savings { Savings(unsigned int accNo) { acntNumber = accNo; count++; if(pFirst == NULL) pFirst = this; else { for(Saving *ps =pFirst;pS-pNext;pS= pS-Next); pS-pNext;} } protected: static Savings * pFirst; static count; Savings *pNext; unsigned int acntNumber; }; 再论虚函数 什么是纯虚函数? class A { virtual int fn(float c)=0; }; 能这样写吗? virtual int A::fn ( float c )=0; VTable class A { public: virtual void play(){} virtual void what() virtual void Adjust() } 虚表创建规则 1 编译器对每个包含虚函数的类创建一个表(VTABLE) .在VTABLE中,编译器放置特定类的虚函数地址. 2 每当创建一个从包含有虚函数的类派生一个类时,编译器就为这个类创建一VTABLE 3 如果在这个派生类中没有对在基类中声明为v i r t u a l的函数进行重新定义,编译器就使用基类的这个虚函数地址. 4 如果在这个派生类中有对在基类中声明为v i r t u a l的函数进行重新定义,就替换掉原来基类的虚函数的地址,并且位置保持一致. 5 派生类中新定义的基类没有的虚函数放在后面. VTable class A { public: virtual void play(){} virtual void what() virtual void Adjust() } VPTR 注意:VTABLE针对类 VPTR针对对象 对于每个对象只有一个VPTR。VPTR必须被初始化为指向相应的VTA BLE。一旦VPTR被初始化为指向相应的VTABLE,对象就“知道”它自己是什么类型。但只有当虚函数被调用时这种自我知识才有用 当创建一个包含有虚函数的对象时,必须初始化它的VPTR以指向相应的VTABLE 。这必须在有关虚函数的任何调用之前完成。编译器在构造函数的开头部分秘密地插入能初始化V P T R的代码。事实上,即使我们没有对一个类创建构造函数,编译器也会为我们创建一个带有相应V P T R初始化代码的构造函数(如果有虚函数) 多态简单理解 你有个基类的指针,调用了一个虚函数,请问这个虚函数是基类的吗?那么是谁的? 我们如何实现多态? 在函数参数中,使用基类指针或引用 在非函数调用阶段,使用指针 参数使用对象无法实现多态 纯虚函数 class Base { public: Base(){} virtual void x() = 0; } 抽象类 一个类若他有一个纯虚函数,这个类就是抽象类 抽象类不能实例化. class A { virtual f1()=0; virtual f2(){}; }; A a;//err 多继承 class?AmphibianCar:public?Car,public?Boat {? public:? AmphibianCar(int?weight,int?aird,float?tonnage)? ?? ?:Vehicle(weight),Car(weight,aird),Boat(weight,tonnage)? //有问题 ????????//多重继承要注意调用基类构造函数? ????????{? ????????? ?????

文档评论(0)

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

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

1亿VIP精品文档

相关文档