07面向对象_多重继承-重载-改写

07面向对象_多重继承-重载-改写

ID:37555490

大小:3.38 MB

页数:93页

时间:2019-05-25

07面向对象_多重继承-重载-改写_第1页
07面向对象_多重继承-重载-改写_第2页
07面向对象_多重继承-重载-改写_第3页
07面向对象_多重继承-重载-改写_第4页
07面向对象_多重继承-重载-改写_第5页
资源描述:

《07面向对象_多重继承-重载-改写》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、多重继承多重的分类?TheauthorofthetextbookisNorthAmericanMaleProfessorParent11/18/20111分类化继承多重继承:一个对象可以有两个或更多不同的父类,并可以继承每个父类的数据和行为。派生的分类对每个父类仍然符合“是一个”规则,或“作为一个”关系。Is-ahas-aas-a同时扮演多个角色。11/18/20112多重继承的问题?11/18/201131.名称歧义1.父类存在同名方法?11/18/20114例ACardDeckknowshowtodrawaCard.AGraphicalItemknow

2、showtodrawanimageonascreen.AGraphicalCardDeckshouldbeabletodraw.which?11/18/20115解决方案11.使用全限定名GraphicalCardDeckgcd;Card*aCard=gcd->CardDeck::draw();gcd->GraphicalObject::draw();丌够理想:语法上不其他的函数调用语法丌同程序员必须记住哪个方法来自于哪个类11/18/20116解决方案22.使用重定义和重命名的结合classGraphicalCardDeck:publicCardDeck,publ

3、icGraphicalObject{public:virtualCard*draw(){returnCardDeck::draw();}virtualvoiddraw(Graphics*g){GraphicalObject::draw(g);}}GraphicalCardDeckgcd;Graphisg;gcd->draw();//selectsCardDeckdrawgcd->draw(g);//selectsGraphicalObjectdraw11/18/20117解决方案2使用重定义和重命名的结合classGraphicalCardDeck:publicCa

4、rdDeck,publicGraphicalObject{public:virtualvoiddraw(){returnCardDeck::draw();}virtualvoidpaint(){GraphicalObject::draw();}}GraphicalCardDeckgcd;gcd->draw();//selectsCardDeckdrawgcd->paint();//selectsGraphicalObjectdraw11/18/201182对替换的影响名称重定义仅解决了单独使用GraphicalCardDeck类时的部分问题。考虑使用替换原则带来

5、的问题?11/18/20119问题?图形对象组成的列表GraphicalObject*g=newGraphicalCardDeck();g->draw();//opps,doingwrongmethod!希望执行显示图像,结果执行了CardDeck中对应的draw方法,而不是图形操作。11/18/201110在C++语言中,解决这一问题的典型方法就是引入两个新的辅助类。并且使用不同的方法名称来重定义draw操作。11/18/201111ClassCardDeckParent:publicCardDeck{Public:virtualvoiddraw(){cardD

6、eckDraw();}virtualvoidcardDeckDraw(){CardDeck::draw();}};ClassGraphicalObjectParent:publicGraphicalObject{Public:virtualvoiddraw(){goDraw();}virtualvoidgoDraw(){GraphicalObject::draw();}};11/18/201112子类继承这些新的父类,改写相应的新方法。当独立使用子类时,新的子类对两个行为都可以访问当以替换的方式对该对象赋值给任何一个父类的实例时,都会产生所希望的行为。11/1

7、8/201113ClassGraphicalCardDeck:publicCardDeckParent,GraphicalObjectParent{Public:virtualvoidcardDeckDraw(){}virtualvoidgoDraw(){}};11/18/201114接口的多重继承Java,C#语言都不支持类的多重继承,但它们都支持接口的多重继承。对于子类来说,接口不为其提供任何代码,所以不会产生两部分继承代码之间的冲突。11/18/201115相同类型签名interfaceCardDeck{publicvoiddraw()}interfa

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。