华南理工大学计算机学院周霭如2016华南理工大学计算机学院周霭如2016第8章继承8.1类之间的关系8.2基类和派生类8.3基类的初始化8.4继承的应用实例8.5多继承小结华南理工大学计算机学院周霭如20168.1类之间的关系has-A,uses-A和is-Ahas-A包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。uses-A一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友元或对象参数传递实现。is-A机制称为“继承”。关系具有传递性,不具有对称性。华南理工大学计算机学院周霭如20168.1类之间的关系不具有对称性不是所有植物都属于蕨类传递性高等植物、蕨类植物、芒萁都是植物,具有植物的共同特征植物低等植物高等植物藻类菌类地衣类苔藓类蕨类裸子类被子类地钱小金发草毛蕨芒萁杉木柏木荔枝橘子华南理工大学计算机学院周霭如20168.1类之间的关系继承是类之间定义的一种重要关系一个B类继承A类,或称从类A派生类B类A称为基类(父类),类B称为派生类(子类)AB1B2C1C2C3B1,B2的基类A的派生类C1,C2,C3的基类A的派生类(单继承)C3的基类B1,B2的派生类(多继承)B1的派生类华南理工大学计算机学院周霭如2016华南理工大学计算机学院周霭如2016类继承关系的语法形式class派生类名:基类名表{数据成员和成员函数声明};8.2基类和派生类华南理工大学计算机学院周霭如2016类继承关系的语法形式class派生类名:基类名表{数据成员和成员函数声明};8.2基类和派生类基类名表构成访问控制基类名1,访问控制基类名2,…,访问控制基类名n华南理工大学计算机学院周霭如2016类继承关系的语法形式class派生类名:基类名表{数据成员和成员函数声明};8.2基类和派生类基类名表构成访问控制基类名1,访问控制基类名2,…,访问控制基类名n访问控制表示派生类对基类的继承方式,使用关键字:public公有继承private私有继承protected保护继承华南理工大学计算机学院周霭如2016派生类对基类成员的使用,与继承访问控制和基类中成员性质有关公有继承基类的公有成员派生类的公有成员基类的保护成员派生类的保护成员私有继承基类的公有成员和保护成员派生类的私有成员保护继承基类的公有成员和保护成员派生类的保护成员不论种方式继承基类,派生类都不能直接使用基类的私有成员8.2.1访问控制8.2.1访问控制华南理工大学计算机学院周霭如20168.2.1访问控制1.公有继承public成员public成员protected成员protected成员private成员public成员protected成员private成员基类派生类华南理工大学计算机学院周霭如2016#includeiostreamusingnamespacestd;classA{public:voidget_XY(){coutEntertwonumbersofx,y:;cinxy;}voidput_XY(){coutx=x,y=y'\n';}protected:intx,y;};classB:publicA{public:intget_S(){returns;};voidmake_S(){s=x*y;};//使用基类数据成员x,yprotected:ints;};classC:publicB{public:voidget_H(){coutEnteranumberofh:;cinh;}intget_V(){returnv;}voidmake_V(){make_S();v=get_S()*h;}//使用基类成员函数protected:inth,v;};例8-1公有继承的测试华南理工大学计算机学院周霭如2016#includeiostreamusingnamespacestd;classA{public:voidget_XY(){coutEntertwonumbersofx,y:;cinxy;}voidput_XY(){coutx=x,y=y'\n';}protected:intx,y;};classB:publicA{public:intget_S(){returns;};voidmake_S(){s=x*y;};//使用基类数据成员x,yprotected:ints;};classC:publicB{public:voidget_H(){coutEnteranumberofh:;cinh;}intget_V(){returnv;}voidmake_V(){make_S();v=get_S()*h;}//使用基类成员函数protected:inth,v;};classAclassC:publicBclassB:publicA8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016#includeiostreamusingnamespacestd;classA{public:voidget_XY(){coutEntertwonumbersofx,y:;cinxy;}voidput_XY(){coutx=x,y=y'\n';}protected:intx,y;};classB:publicA{public:intget_S(){returns;};voidmake_S(){s=x*y;};//使用基类数据成员x,yprotected:ints;};classC:publicB{public:voidget_H(){coutEnteranumberofh:;cinh;}intget_V(){returnv;}voidmake_V(){make_S();v=get_S()*h;}//使用基类成员函数protected:inth,v;};classAclassC:publicYclassB:publicX保护数据成员在类层次中可见8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016intmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016intmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAxy8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016intmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAxyobjB.sobjB.yobjB.xobjBs8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016intmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBxysobjC.hobjC.vobjC.sobjC.yobjC.xobjChv8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016intmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC对objA的数据成员操作xyshv8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016intmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用基类A成员函数对objB的数据成员操作xyshv8.2.1访问控制例8-1公有继承的测试华南理工大学计算机学院周霭如2016intmain(){AobjA;BobjB;CobjC;coutItisobject_A:\n;objA.get_XY();objA.put_XY();coutItisobject_B:\n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;coutItisobject_C:\n;objC.get_XY();objC.get_H();objC.make_V();coutV=objC.get_V()endl;}objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用派生类B成员函数对objB的数据成员操作xyshv8.2.1