面向对象程序设计第5章.ppt
《面向对象程序设计第5章.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计第5章.ppt(69页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5章章 继承继承(inheritance)5.1 类层次结构类层次结构类层次结构类层次结构5.2 基类与派生类基类与派生类 l l几个概念:几个概念:几个概念:几个概念:l l基类(父类)基类(父类)基类(父类)基类(父类)l l派生类(子类):从基类派生而成的类派生类(子类):从基类派生而成的类派生类(子类):从基类派生而成的类派生类(子类):从基类派生而成的类l l基类和派生类:构成类的层次关系基类和派生类:构成类的层次关系基类和派生类:构成类的层次关系基类和派生类:构成类的层次关系哺乳类哺乳类哺乳类哺乳类猫科猫科猫科猫科基类基类基类基类 baseclassbaseclass派生类派生
2、类派生类派生类derivedclassderivedclass派生类的定义派生类的定义对于基类对于基类对于基类对于基类PersonPerson,可以这样来定义:,可以这样来定义:,可以这样来定义:,可以这样来定义:classPersonclassPerson/./.;派生类在声明的时候,必须在类名和类的本体之间加上冒号派生类在声明的时候,必须在类名和类的本体之间加上冒号派生类在声明的时候,必须在类名和类的本体之间加上冒号派生类在声明的时候,必须在类名和类的本体之间加上冒号“:”,publicpublic(继承方式)以及基类的名称。下面定义(继承方式)以及基类的名称。下面定义(继承方式)以及基类
3、的名称。下面定义(继承方式)以及基类的名称。下面定义基类基类基类基类PersonPerson的派生类的派生类的派生类的派生类StudentStudent:classStudent:publicPersonclassStudent:publicPerson/./.;5.3 派生类对象的构造派生类对象的构造 l l5.3.15.3.1派生类对象的内存空间派生类对象的内存空间派生类对象的内存空间派生类对象的内存空间 实际上,在前面的继承关系里面,派生类实际上,在前面的继承关系里面,派生类实际上,在前面的继承关系里面,派生类实际上,在前面的继承关系里面,派生类StudentStudent包包包包含了基
4、类含了基类含了基类含了基类PersonPerson的一个子对象,就像在的一个子对象,就像在的一个子对象,就像在的一个子对象,就像在StudentStudent中创建中创建中创建中创建PersonPerson的一个对象,而不从的一个对象,而不从的一个对象,而不从的一个对象,而不从PersonPerson中继承一样。无论中继承一样。无论中继承一样。无论中继承一样。无论是类中的对象成员还是基类部分,都被认为是子对象。是类中的对象成员还是基类部分,都被认为是子对象。是类中的对象成员还是基类部分,都被认为是子对象。是类中的对象成员还是基类部分,都被认为是子对象。例例 5-1 派生类派生类Student的
5、定义的定义#include#include#include#include usingnamespacestd;usingnamespacestd;classclassPersonPersonprivate:private:charName20;charName20;intintAge;Age;charSex;charSex;/./.其它的属性其它的属性其它的属性其它的属性publicpublic:personperson(char(char*pNamepName=NoName,=NoName,intintpAgepAge=0,char=0,charpSexpSex=M)=M)strcpy(N
6、ame,pNamestrcpy(Name,pName););Age=Age=pAgepAge;Sex=Sex=pSexpSex;voidvoidSet(charSet(char*pNamepName=NoName,=NoName,intint pAgepAge=0,char=0,charpSexpSex=M)=M)strcpy(Name,pNamestrcpy(Name,pName););Age=Age=pAgepAge;Sex=Sex=pSexpSex;char*char*GetNameGetName()()returnName;returnName;intint GetAgeGetAge(
7、)()returnAge;returnAge;charcharGetSexGetSex()()returnSex;returnSex;voidDisplay()voidDisplay()coutcoutName:Name,Age:AgeName:Name,Age:Age,Sex:Sex,Sex:Sexendlendl;classclassStudent:Student:publicpublicpersonperson protectedprotected:charMajor40;charMajor40;unsignedunsignedintint IdNumberIdNumber;unsign
8、edunsignedintintLevel;Level;publicpublic:char*char*GetMajorGetMajor()()returnMajor;returnMajor;unsignedunsignedintint GetIdNumberGetIdNumber()()returnreturnIdNumberIdNumber;unsignedunsignedintint GetLevelGetLevel()()returnLevel;returnLevel;intintmain()main()PersonPersonper(Zhangper(ZhangHong,20,F);H
9、ong,20,F);StudentStudentstustu;per.Displayper.Display();();stu.Displaystu.Display();();per.Set(Wangper.Set(WangLin,18,F);Lin,18,F);stu.Set(Zhaostu.Set(ZhaoWei,21,M);Wei,21,M);per.Displayper.Display();();stu.Displaystu.Display();();return0return0;程序运行结果如下:程序运行结果如下:程序运行结果如下:程序运行结果如下:Name:ZhangName:Zha
10、ng Hong,Age:20,Sex:F Hong,Age:20,Sex:FName:NoName:No Name,Age:0,Sex:M Name,Age:0,Sex:MName:WangName:Wang Lin,Age:18,Sex:F Lin,Age:18,Sex:FName:ZhaoName:Zhao Wei,Age:21,Sex:M Wei,Age:21,Sex:M 例例例例 5-2 5-2 重新定义派生类重新定义派生类重新定义派生类重新定义派生类StudentStudent中的中的中的中的SetSet和和和和DisplayDisplay函数函数函数函数 classclassStu
11、dent:Student:publicpublicPersonPerson protected:protected:charMajor40;charMajor40;unsignedunsignedintint IdNumberIdNumber;unsignedunsignedintintLevel;Level;public:public:char*char*GetMajorGetMajor()()returnMajor;returnMajor;unsignedunsignedintint GetIdNumberGetIdNumber()()returnreturnIdNumberIdNumbe
12、r;unsignedunsignedintint GetLevelGetLevel()()returnLevel;returnLevel;voidvoidSet(charSet(char*pMajorpMajor=0,=0,unsignedunsignedintint pIdNumberpIdNumber=0,=0,unsignedunsignedintint pLevelpLevel=0)=0)strcpy(Major,pMajorstrcpy(Major,pMajor););IdNumberIdNumber=pIdNumberpIdNumber;Level=Level=pLevelpLev
13、el;voidvoidSet(charSet(char*pName,intpName,int pAge,charpAge,char pSexpSex,char*char*pMajor,unsignedpMajor,unsigned intint pIdNumberpIdNumber,unsignedunsignedintint pLevelpLevel)Person:Set(pName,pAge,pSexPerson:Set(pName,pAge,pSex););strcpy(Major,pMajorstrcpy(Major,pMajor););IdNumberIdNumber=pIdNumb
14、erpIdNumber;Level=Level=pLevelpLevel;voidDisplay()voidDisplay()Person:DisplayPerson:Display();();coutcoutIdNumberIdNumber:IdNumberIdNumber,Major:Major,Major:Major,Level:Level,Level:Levelendlendl;voidmain()voidmain()PersonPersonper(Zhangper(ZhangHong,20,F);Hong,20,F);StudentStudentstustu;per.Displayp
15、er.Display();();stu.Displaystu.Display();();per.Set(Wangper.Set(WangLin,18,F);Lin,18,F);stu.Set(Computer,1001,2);stu.Set(Computer,1001,2);per.Displayper.Display();();stu.Displaystu.Display();();输出结果输出结果Name:ZhangName:Zhang Hong,Age:20,Sex:F Hong,Age:20,Sex:FName:NoName:No Name,Age:0,Sex:M Name,Age:0
16、,Sex:MIdNumber:3435973836,Major:IdNumber:3435973836,Major:烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫Zhang HoZhang Hong,Level:3435973836ng,Level:3435973836Name:WangName:Wang Lin,Age:18,Sex:F Lin,Age:18,Sex:FName:NoName:No Name,Age:0,Sex:M Name,Age:0,Sex:MIdNumber:1001,Major:Computer,Lev
17、el:2IdNumber:1001,Major:Computer,Level:2重新定义(重新定义(redefinition)重新定义并非重载,对基类重新定义并非重载,对基类重新定义并非重载,对基类重新定义并非重载,对基类PersonPerson的的的的SetSet和和和和DisplayDisplay函数而函数而函数而函数而言,它们位于言,它们位于言,它们位于言,它们位于基类的类域基类的类域基类的类域基类的类域中,所以通过基类对象中,所以通过基类对象中,所以通过基类对象中,所以通过基类对象perper调用调用调用调用SetSet和和和和DisplayDisplay的时候调用的是基类的这两个函数
18、,同样对于派生类的时候调用的是基类的这两个函数,同样对于派生类的时候调用的是基类的这两个函数,同样对于派生类的时候调用的是基类的这两个函数,同样对于派生类StudentStudent的的的的SetSet和和和和DisplayDisplay函数而言,它们位于函数而言,它们位于函数而言,它们位于函数而言,它们位于派生类的类域派生类的类域派生类的类域派生类的类域中,中,中,中,所以通过派生类类对象所以通过派生类类对象所以通过派生类类对象所以通过派生类类对象stustu调用调用调用调用SetSet和和和和DisplayDisplay的时候调用的是派的时候调用的是派的时候调用的是派的时候调用的是派生类的
19、生类的生类的生类的SetSet和和和和DisplayDisplay函数。现在用函数。现在用函数。现在用函数。现在用StudentStudent类定义一个名字还是类定义一个名字还是类定义一个名字还是类定义一个名字还是叫叫叫叫stustu的对象:的对象:的对象:的对象:StudentStudentstustu;下面的两个函数调用:下面的两个函数调用:下面的两个函数调用:下面的两个函数调用:stu.Set(Zhaostu.Set(ZhaoWei,20,M,Computer,Wei,20,M,Computer,1001,2);1001,2);stu.GetIdNumberstu.GetIdNumber
20、();();stu.Displaystu.Display();();调用的都是派生类调用的都是派生类调用的都是派生类调用的都是派生类StudentStudent中新定义的成员函数。由于中新定义的成员函数。由于中新定义的成员函数。由于中新定义的成员函数。由于GetAgeGetAge和和和和GetNameGetName函数在没有重新定义,所以,函数在没有重新定义,所以,函数在没有重新定义,所以,函数在没有重新定义,所以,stu.GetAgestu.GetAge();();stu.GetNamestu.GetName();();所调用的仍是基类所调用的仍是基类所调用的仍是基类所调用的仍是基类Pers
21、onPerson中原有的成员函数。中原有的成员函数。中原有的成员函数。中原有的成员函数。覆盖覆盖 如果在基类存在这样的重载函数:如果在基类存在这样的重载函数:如果在基类存在这样的重载函数:如果在基类存在这样的重载函数:voidSet();voidSet();voidvoidSet(charSet(char*,*,int,charint,char););同时在派生类中对同时在派生类中对同时在派生类中对同时在派生类中对SetSet函数进行了重新定义,函数进行了重新定义,函数进行了重新定义,函数进行了重新定义,StatusStatusSet(charSet(char*,*,int,charint,c
22、har););即使函数的返回值类型不一样。基类中的所有名为即使函数的返回值类型不一样。基类中的所有名为即使函数的返回值类型不一样。基类中的所有名为即使函数的返回值类型不一样。基类中的所有名为SetSet的函数的函数的函数的函数也都将被覆盖,也就是说,派生类的对象无法再调用基类的也都将被覆盖,也就是说,派生类的对象无法再调用基类的也都将被覆盖,也就是说,派生类的对象无法再调用基类的也都将被覆盖,也就是说,派生类的对象无法再调用基类的同名函数同名函数同名函数同名函数SetSet。即:。即:。即:。即:stu.Setstu.Set();();编译器将会报错。编译器将会报错。编译器将会报错。编译器将会
23、报错。可以在派生类的成员函数内部通过使用类名和可以在派生类的成员函数内部通过使用类名和可以在派生类的成员函数内部通过使用类名和可以在派生类的成员函数内部通过使用类名和作用域解析符作用域解析符作用域解析符作用域解析符“:”来调用基类的成员函数,从而来调用基类的成员函数,从而来调用基类的成员函数,从而来调用基类的成员函数,从而改变或者显示基类的数据成员。当然,也可以定义专改变或者显示基类的数据成员。当然,也可以定义专改变或者显示基类的数据成员。当然,也可以定义专改变或者显示基类的数据成员。当然,也可以定义专门用于取用基类中数据的成员函数:门用于取用基类中数据的成员函数:门用于取用基类中数据的成员函
24、数:门用于取用基类中数据的成员函数:voidvoidSetPersonSetPerson()()Person:SetPerson:Set();();voidvoidDisplayPersonDisplayPerson()()Person:DisplayPerson:Display();();这里需要注意函数的名字不能使用这里需要注意函数的名字不能使用这里需要注意函数的名字不能使用这里需要注意函数的名字不能使用SetSet和和和和DisplayDisplay,原因在前面刚提到过,因为在派生类中,原因在前面刚提到过,因为在派生类中,原因在前面刚提到过,因为在派生类中,原因在前面刚提到过,因为在派生
25、类中已经对已经对已经对已经对SetSet和和和和DisplayDisplay函数进行了重新定义。函数进行了重新定义。函数进行了重新定义。函数进行了重新定义。5.3.2 公有继承的含义公有继承的含义 C+面向对象编程中一条重要的规则是:面向对象编程中一条重要的规则是:公有继承意味着公有继承意味着”是一个是一个”(isa)对于对于对于对于classD:classD:publicpublicBB;当写下类当写下类当写下类当写下类D D(”Derived”Derived”)从类从类从类从类B B(”Base”Base”)公有继承时,你实际上是在告诉编译器(以及读这公有继承时,你实际上是在告诉编译器(以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计
限制150内