- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.3 多重继承 当派生类有二个或二个以上的基类时,这种派生方法称为多基派生或多重继承。 1.多重继承的声明 一般形式如下: Class 派生类名:派生方式1 基类名1,…,派生方式n 基类名n{ //派生类新增的数据成员和成员函数 }; 例如:class z:public x,y{…};//类Z公有继承了X,私有继承了Y class z:x,public y{…}//类Z私有继承了X,公有继承了Y class z:public x,public y{…}//类Z公有继承了X,Y 即默认的是私有继承 在多继承中,基类成员的访问属性与单继承时相同. 例5.12:观察各成员的访问特性的变化。Ex5_12.cpp class X{ public: int f(); }; class Y{ public: int f(); int g(); }; class Z:public X,public Y{ int g(); }; 说明:对基类的成员访问必有是无二义的,例如: 如果定义类Z的对象obj Z obj 则 obj.f()将执行基类X的f(),还是基类Y的f() 这时可以用成员名限定来消除二义性。 Obj.X::f() Obj.Y::f() //ex5_12多继承情况下的访问特性 #includeiostream.h class A{ public: void setA(int x){a=x;} void printA(){ couta=aendl;} private:int a; }; class B{ public: void setB(int x){b=x;} void printB() {coutb=bendl;} private:int b; }; class C:public A,private B{ public: void setC(int x,int y) {c=x; setB(y);} void printC() {printB();coutc=cendl;} private:int c; }; void main() { C obj; obj.setA(3); obj.printA(); // obj.setB(4);//错误 // obj.printB();//错误 obj.setC(6,8); obj.printC(); } 2.多重继承的构造函数与析构函数 一般形式如下: 派生类构造函数名(参数表):基类1的构造函数名(参数表),基类2的构造函数名(参数表),…,基类n的构造函数名(参数表) {…} 例5.13:注意派生类的构造函数的定义方法。 Ex5_13.cpp 多重继承的构造函数的执行顺序也是:先执行基类的构造函数,再执行对象成员的构造函数,最后执行派生类的构造函数的原则。在多基类之间,则严格按照派生类声明时从左到右的顺序来执行。而析构函数执行顺序则相反。 3.虚基类 (1)为了解决二义性,C++引入了虚基类。 当引用派生类的成员时,首先要在派生类自身的作用域内寻找这个成员,如果没有,则在它的基类中寻找。如果一个派生类是从多个基类派生而来,并且这些基类又有一个共同的基类,则在这个派生类中访问这个共同的基类中的成员时,可能会产生二义性。 base base base1 base2 derived 例5.14:base1和base2是基类base不同的拷贝,因此要产生二义性。 Ex5_14.cpp base base1 base2 derived 2.虚基类的概念 如果想使公共基类只产生一个拷贝,则可将此基类说明为虚基类。这就要求从基类产生新类时,使用关键字virtual将基类说明为虚基类。 Ex5_15.cpp * * 5.1 继承(Inheritance)的概念: 一个类的数据成员和成员函数,有些是类本身自己定义的,有一些是可继承的或通过模板生成的。 所谓继承就是利用已有的数据类型定义出新的数据类型。该机制自动地为一个类提供来自另一个类的操作和数据结构,程序员只需在新类中定义已有类中没有的成分来建立新类。利用类的“继承”,就可以将使原来的程序代码重用,从而减少了程序代码的冗余度,符合软件重用的目标。所以说,继承是面向对象程序设计的一个重要机制。另外,在C++中扩充派生类成员的方法是非常灵活的。 本章重点与难点:继承的概念和不同形式的派生继承对成员访问属性的影响.多重继承的虚基类概念. class person{ protected: char name[10]; int age; char sex; public: void print(); }; class employee{ prot
文档评论(0)