- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第十章 继承1
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * class Bed : public Furniture{ public: Bed(){} void sleep()const{ cout Sleeping...\n; }}; class Sofa : public Furniture{ public: Sofa(){} void watchTV()const{ cout Watching TV.\n; }}; class SleeperSofa : public Bed, public Sofa{ public: SleeperSofa() :Sofa(), Bed(){} void FoldOut()const{ cout Fold out the sofa.\n; }}; int main(){ SleeperSofa ss; ss.setWeight(20); // error 模糊的setWeight成员 Furniture* pF = (Furniture*)ss; // error 模糊的Furniture* coutpF-getWeight()endl;} 10.7.1 虚拟继承 程序f1007.cpp通不过编译是因为遇到了含糊不清: SleeperSofa对象操作setWeight不知道面对的是哪个Furniture的成员,指向Furniture的指针也不知道是哪个Furniture。 SleeperSofa只需对应一个Furniture对象,所以只希望含有一个Furniture副本,该副本又要共享Bed和Sofa的成员函数与数据成员,如图10-7所示: 图10-7 沙发床的理想继承结构 Furniture(家具) weight getWeight() setWeight() SleeperSofa(沙发床) foldOut() Bed(床) sleep() Sofa(沙发) watchTV() weight weight C++可以实现这种继承结构,用的是虚拟继承,代码如下: f1008.cpp class Furniture{ protected: int weight; public: Furniture(){} void setWeight(int i){ weight =i; } int getWeight()const{ return weight; } }; class Bed : virtual public Furniture{ public: Bed(){} void sleep()const{ cout Sleeping...\n; } };//----------------------------------- class Sofa : virtual public Furniture{ public: Sofa(){} void watchTV()const{ cout Watching TV.\n; } }; class SleeperSofa : public Bed, public Sofa{ public: SleeperSofa() :Sofa(), Bed(){} void foldOut()const{ cout Fold out the sofa.\n; } };//----------------------------------- int main(){ SleeperSofa ss; ss.setWeight(20); coutss.getWeight()endl; } 这时候的对象内存布局如图10-8所示: 虚拟继承的方式是在继承的关键字前面加上virtual关键字。 Furniture部分 weight Bed部分 Sofa部分 SleeperSofa部分 图10-8 虚拟继承的SleeperSofa 对象 10.7.2 对象构造顺序 含有多继承的构造函数按下列顺序调用: 任何虚拟基类的构造函数按照它们被继承的顺序构造 任何非虚拟基类的构造函数按照它们被继承的顺序构造 任何成员对象的构造函数按照它们声明的顺序构造 类自己的构造函数 如果一个类含有虚拟继承,则先从虚拟基类开始,如程序中的构造顺序为: Furniture对象 Bed对象 Sofa对象 SleeperSofa对象 10.7.3 多继承评价 在语言中实现多继承并不容易,主要是编译问题,还有模糊性问题,调试问题也会很多。尽量避免多继承。
文档评论(0)