- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C从零开始(下)——类的相关知识,从零开始学习股票知识,从零开始作品相关,英语基础知识从零开始,从零开始txt全集下载,从零开始学下厨,从零开始做运营下载,从零开始下载,从零开始学英语下载,从零开始学瑜伽下载
C++从零开始(下)——类的相关知识
由于篇幅限制,本篇为《C++从零开始(十一)》的下篇,讨论多态性及一些剩下的问题。
虚的含义
本文的中篇已经介绍了虚的意思,就是要间接获得,并且举例说明电视机的频道就是让
人间接获得电视台频率的,因此其从这个意义上说是虚的,因为它可能操作失败--某个频道
还未调好而导致一片雪花。并且说明了间接的好处,就是只用编好一段代码(按5 频
道),则每次执行它时可能有不同结果(今天5频道被设置成中央5 台,明天可以被定
成中央2台),进而使得前面编的程序(按5频道)显得很灵活。注意虚之所以能够很灵活
是因为它一定通过“一种手段”来间接达到目的,如每个频道记录着一个频率。但这是不够的,
一定还有“另一段代码”能改变那种手段的结果(频道记录的频率),如调台。
先看虚继承。它间接从子类的实例中获得父类实例的所在位置,通过虚类表实现(这是
“一种手段”),接着就必须能够有“另一段代码”来改变虚类表的值以表现其灵活性。首先可
以自己来编写这段代码,但就要求清楚编译器将虚类表放在什么地方,而不同
的编译器有不同的实现方法,则这样编写的代码兼容性很差。C++当然给出了“另一段代
码”,就是当某个类在同一个类继承体系中被多次虚继承时,就改变虚类表的值以使各子类
间接获得的父类实例是同一个。此操作的功能很差,仅仅只是节约内存而已。如:
structA {long a; };
structB : virtual public A{ long b;}; structC : virtual public A {long c;};
structD: public B,public C {long d; };
这里的D 中有两个虚类表,分别从B和C 继承而来,在D 的构造函数中,编译器会编
写必要的代码以正确初始化D的两个虚类表以使得通过B 继承的虚类表和通过C 继承的虚
类表而获得的A 的实例是同一个。
再看虚函数。它的地址被间接获得,通过虚函数表实现(这是“一种手段”),接着就必
须还能改变虚函数表的内容。同上,如果自己改写,代码的兼容性很差,而C++也给出了“另
一段代码”,和上面一样,通过在派生类的构造函数中填写虚函数表,根据当前派生类的情
况来书写虚函数表。它一定将某虚函数表填充为当前派生类下,类型、名字和原来被定义为
虚函数的那个函数尽量匹配的函数的地址。如:
structA {virtual void ABC(),BCD( float ),ABC( float );};
structB : public A{ virtual voidABC(); };
structC: public B {void ABC( float ),BCD( float );virtual float CCC(double );};
structD: public C {void ABC(),ABC( float ),BCD( float );};
在A::A 中,将两个A::ABC 和一个A::BCD 的地址填写到A的虚函数表中。
在B::B 中,将B::ABC 和继承来的B::BCD 和B::ABC 填充到B的虚函数表中。
在C::C 中,将C::ABC、C::BCD 和继承来的C::ABC 填充到C 的虚函数表中,并添加
一个元素:C::CCC。
在D::D 中,将两个D::ABC 和一个D::BCD 以及继承来的D::CCC 填充到D 的虚函数
表中。
这里的D是依次继承自A、B、C,并没有因为多重继承而产生两个虚函数表,其只有
一个虚函数表。虽然D中的成员函数没有用virtual 修饰,但它们的地址依旧被填到D 的虚
函数表中,因为virtual 只是表示使用那个成员函数时需要间接获得其地址,与是否填写到
虚函数表中没有关系。
电视机为什么要用频道来间接获得电视台的频率?因为电视台的频率人不容易记,并且
如果知道一个频率,慢慢地调整共谐电容的电容值以使电路达到那个频率效率很低下。而做
10 组共谐电路,每组电路的电容值调好后就不再动,通过切换不同的共谐电路来实现快速
转换频率。因此间接还可以提高效率。还有,5 频道本来是中央5 台,后来看腻了把它换成
中央2 台,则同样的动作(按5频道)将产生不同的结果,“按5频道”这个程序编得很灵活。
由上面,至少可以知道:间接用于简化操作、提高效率和增加灵活性。这里提到的间接
的三个
文档评论(0)