- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
机器视觉团队技术交流讲座 第02讲理解C++虚拟与多态机制2021/5/28目 录多态性虚函数与动态绑定纯虚函数与抽象类实例讲解习题和课后阅读资料2021/5/28多态性2021/5/28多态性的定义何谓多态性?多态性是指给同样的接口发送同样的消息会导致不同的行为。多态意味着一个对象有着多重特征,可以在特定的情况下,表现不同的状态,从而对应着不同的属性和方法。 多态性是面向对象程序设计的重要特征之一。若程序设计语言不支持多态性,不能称为面向对象的语言。2021/5/28C++多态性C++有哪些多态性机制?函数重载运算符重载虚函数函数重载和运算符重载是编译时体现出来的多态性,虚函数则体现了运行时的多态性。2021/5/28虚函数与动态绑定2021/5/28示例:乐器类继承体系类定义Instrument —— 乐器Wind —— 管乐器Woodwind —— 木管乐器Brass —— 铜管乐器Percussion —— 打击乐器Stringed —— 弦乐器接口说明play —— 演奏adjust —— 调整乐器what —— 显示乐器信息2021/5/28类型的向上转换(Upcasting)将派生类地址(指针或引用)沿着继承树向上的方向赋给基类指针(赋值兼容原则)Upcasting将对象按传址(by address)而非传值(by value)方式进行操作,而多态性需通过Upcasting来体现。2021/5/28我们想做什么?提供给用户一个通用的不变的系统使用接口——函数tune(),无论类进行了怎样的变动,这个接口都能正常可靠地工作(总能按照我们的期望选出正确的乐器演奏)2021/5/28我们想做什么?我们的要求是合理的,这种要求系统具备动态识别能力的需求,在实际运行的很多软件系统当中都是一项基本要求,这正是要求系统具备多态性。void tune(Instrument i) { i.play(); } int main() { Wind flute; tune(flute); // Upcasting } 2021/5/289、 人的价值,在招收诱惑的一瞬间被决定。10、低头要有勇气,抬头要有低气。11、人总是珍惜为得到。12、人乱于心,不宽余请。13、生气是拿别人做错的事来惩罚自己。14、抱最大的希望,作最大的努力。15、一个人炫耀什么,说明他内心缺少什么。。16、业余生活要有意义,不要越轨。17、一个人即使已登上顶峰,也仍要自强不息。2021/5/289、 人的价值,在招收诱惑的一瞬间被决定。10、低头要有勇气,抬头要有低气。11、人总是珍惜为得到。12、人乱于心,不宽余请。13、生气是拿别人做错的事来惩罚自己。14、抱最大的希望,作最大的努力。15、一个人炫耀什么,说明他内心缺少什么。。16、业余生活要有意义,不要越轨。17、一个人即使已登上顶峰,也仍要自强不息。2021/5/28void tune(Instrument i) { // ... i.play(middleC);}int main() { Wind flute; tune(flute); // Upcasting return 0;} 我们定义了Wind对象flute,通过接口tune操作play函数,显然我们希望flute对象能正确地调用Wind类的play函数#include iostreamusing namespace std;enum note { middleC, Csharp, Eflat };.class Instrument {public: void play(note) const { cout Instrument::play endl; }};// Wind objects are Instruments// because they have the same interface:class Wind : public Instrument {public: // Redefine interface function: void play(note) const { cout Wind::play endl; }};2021/5/28先看一个例子…void tune(Instrument i) { // ... i.play(middleC);}int main() { Wind flute; tune(flute); // Upcasting return 0;} 程序却调用了基类Instrument的play函数,显然这不是我们希望的结果!问题出在哪儿了呢?#include iostreamusing namespace s
文档评论(0)