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

C++第五章2).ppt

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

相关文档