第十七章多重继承

第十七章多重继承

ID:21795834

大小:357.00 KB

页数:83页

时间:2018-10-20

第十七章多重继承_第1页
第十七章多重继承_第2页
第十七章多重继承_第3页
第十七章多重继承_第4页
第十七章多重继承_第5页
资源描述:

《第十七章多重继承》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、1第十七章多重继承2本章主要内容多继承如何工作多继承的构造顺序继承的模糊性(二义性问题)虚基类保护继承与私有继承3在现实世界中存在一个类是由多个类派生的情况。两用沙发,它是一个沙发,也是一个床。两用沙发应允许同时继承沙发和床的特征。4多继承时派生类的定义class派生类名:继承方式1基类名1, 继承方式2基类名2,...{成员定义;}注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。5,所讨论的类层次中,每个类只继承一个父辈,在现实世界中事情通常是这样的。但是一些类却代表两个类的合成。例如,两用沙发,它是一个沙发,也是一张床,

2、两用沙发应允许同时继承沙发和床的特征,即SleeperSofa继承Bed和Sofa两个类,如图所示。其程序代码如下:两用沙发的类层次6classBed{public:Bed():weight(0){}voidSleep(){cout<<"Sleeping...";}voidSetWeight(inti){weight=i;}protected:intweight;};classSofa{public:Sofa():weight(0){}voidWatchTV(){cout<<"WatchingTV.";}voidSetWeigh

3、t(inti){weight=i;}protected:intweight;};7classSleeperSofa:publicBed,publicSofa{public:SleeperSofa(){}voidFoldOut(){cout<<"Foldoutthesofa.";}};voidmain(){SleeperSofass;ss.WatchTV();ss.FoldOut();ss.Sleep();cin.get();}8运行结果为:WatchingTV.Foldoutthesofa.Sleeping...两用沙发继承两个基类

4、的所有成员,这样ss.Sleep()和ss.WmchTV()的调用是合法的。也就可以把SleeperSofa)fa当作一个Bed或一个Sofa用。另外,SleeperSoa类还有它自己的成员FoldOut()。9多继承举例classA{public:voidsetA(int);voidshowA();private:inta;};classB{public:voidsetB(int);voidshowB();private:intb;};classC:publicA,privateB{public:voidsetC(int,int,in

5、t);voidshowC();private:intc;};voidA::setA(intx){a=x;}voidB::setB(intx){b=x;}voidC::setC(intx,inty,intz){SetA(x);SetB(y);c=z;}//其它函数实现略intmain(){Cobj;obj.setA(5);obj.showA();obj.setC(6,7,9);obj.showC();obj.setB(6);obj.showB();return0;}//error//error11本章主要内容多继承如何工作继承的模糊性(二

6、义性问题)多继承的构造顺序虚基类12Sofa和Bed都有一个成员weight,这是合理的,因为两者都是实体,都有一个重量。问题是SleeperSofa继承哪个重量?既然两者都继承,由于两者有相同的名字weight,使得对weight的引用变得模糊不清。13二义性问题在多继承时,基类之间出现同名成员时,将出现访问时的二义性(不确定性)。例如,按照下面引用:voidmain(){SleeperSofass;ss.SetWeight(20);//Bed的SetWeight还是Sofa的SetWeight?}14这样导致了名称冲突(nameco

7、llision),在编译时将予以拒绝。程序必须在重量前面说明基类:voidmain(){SleeperSofass;ss.Sofa::SetWeight(20);//说明是沙发重量20斤}在编写应用程序时,程序员还得额外知道类的层次信息,加大了复杂度。这些在单继承中是不会出现的。15二义性问题举例classA{public:voidf();};classB{public:voidf();voidg();};classC:publicA,publicB{public:voidg();voidh();};main(){Cc;c.f();c.

8、g();}//error16二义性的解决方法解决方法一:用类名来限定c1.A::f()或c1.B::f()解决方法二:同名覆盖 在C中定义一个同名成员函数f(),f()再根据需要调用A::f()或B::f(

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

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

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