面向对象_5多重继承.ppt

面向对象_5多重继承.ppt

ID:48765052

大小:729.50 KB

页数:95页

时间:2020-01-22

面向对象_5多重继承.ppt_第1页
面向对象_5多重继承.ppt_第2页
面向对象_5多重继承.ppt_第3页
面向对象_5多重继承.ppt_第4页
面向对象_5多重继承.ppt_第5页
资源描述:

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

1、10/5/20211多重的分类?TheauthorofthetextbookisNorthAmericanMaleProfessorParent第13章多重继承10/5/20212多重继承:一个对象可以有两个或更多不同的父类,并可以继承每个父类的数据和行为。派生的分类对每个父类仍然符合“是一个”规则,或“作为一个”关系。Is-ahas-aas-a同时扮演多个角色。分类化继承10/5/20213Char类作为Magnitude类的子类,但却不是Number类的子类。Integer类既是Magnitude类的子类,又是Number类的子类。Complex类应该是Number类的子类,但却不是

2、Magnitude类的子类。观察10/5/20214Complex作为Number的子类,Number作为Magnitude的子类,重定义与度量相关的方法。限制子类化。在类Char、Integer和Complex中避免使用继承,并重定义每个类的方法。使用部分类继承层次,对其余的继承进行模拟。使Magnitude和Number这两个类互相独立,Integer类使用继承,从两个父类导出属性。解决方案?10/5/20215好的方案10/5/20216多重继承的问题?10/5/20217父类存在同名方法?1.名称歧义10/5/20218ACardDeckknowshowtodrawaCard.A

3、GraphicalItemknowshowtodrawanimageonascreen.AGraphicalCardDeckshouldbeabletodraw.which?例10/5/20219使用全限定名GraphicalCardDeckgcd;Card*aCard=gcd->CardDeck::draw();gcd->GraphicalObject::draw();不够理想:语法上与其他的函数调用语法不同程序员必须记住哪个方法来自于哪个类解决方案110/5/2021102.使用重定义和重命名的结合classGraphicalCardDeck:publicCardDeck,publi

4、cGraphicalObject{public:virtualCard*draw(){returnCardDeck::draw();}virtualvoiddraw(Graphics*g){GraphicalObject::draw(g);}}GraphicalCardDeckgcd;Graphisg;gcd->draw();//selectsCardDeckdrawgcd->draw(g);//selectsGraphicalObjectdraw解决方案210/5/202111使用重定义和重命名的结合classGraphicalCardDeck:publicCardDeck,publi

5、cGraphicalObject{public:virtualvoiddraw(){returnCardDeck::draw();}virtualvoidpaint(){GraphicalObject::draw();}}GraphicalCardDeckgcd;gcd->draw();//selectsCardDeckdrawgcd->paint();//selectsGraphicalObjectdraw解决方案210/5/202112名称重定义仅解决了单独使用GraphicalCardDeck类时的部分问题。考虑使用替换原则带来的问题?2对替换的影响10/5/202113图形对象组

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

7、(){CardDeck::draw();}};ClassGraphicalObjectParent:publicGraphicalObject{Public:virtualvoiddraw(){goDraw();}virtualvoidgoDraw(){GraphicalObject::draw();}};10/5/202116子类继承这些新的父类,改写相应的新方法。当独立使用子类时,新的子类对两个行为都可以访问当以替换的方式对该对

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

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

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