您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > C++中的继承与派生
C++程序设计第4讲继承与派生——参见教材第8章本章重点:理解继承对于处理复杂性和实现代码重用的意义。继承和派生的概念-------从已有的类派生出新的类。如何实现继承。第4讲继承与派生4.1继承与派生的概念继承性是面向对象程序设计中最重要的机制。这种机制提供了无限重复利用程序资源的一种途径。通过C++语言中的继承机制,可以扩充和完善旧的程序设计以适应新的需求。这样不仅可以节省程序开发的时间和资源,并且为未来程序增添了新的资源。classStudent{intnum;charname[30];charsex;public:voiddisplay()//对成员函数display的定义{coutnum:numendl;coutname:nameendl;coutsex:sexendl;}};classStudend1{intnum;//此行原来己有charname[20];//此行原来己有charsex;//此行原来己有intage;charaddr[20];public:voiddisplay();//此行原来己有{coutnum:numendl;//此行原来己有coutname:nameendl;//此行原来己有coutsex:sexendl;//此行原来己有coutage:ageendl;coutaddress:addrendl;}};利用原来定义的类Student作为基础,再加上新的内容即可,以减少重复的工作量。C++提供的继承机制就是为了解决这个问题。在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类(baseclass)”或“父类(fatherclass)”。新建立的类称为“派生类(derivedclass)”或“子类(sonclass)”。一个新类从已有的类那里获得其已有特性称为类的继承,从已有的类(父类)产生一个新的子类称为类的派生。在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。人类:姓名、性别、年龄、身高、体重教师类:姓名、性别、年龄、身高、体重、专业、职称管理人员类:姓名、性别、年龄、身高、体重、职务教师管理人员类:姓名、性别、年龄、身高、体重、专业、职称、职务学生类:姓名、性别、年龄、身高、体重、学号、班级、专业人类教师类学生类管理人员类教师管理人员类多继承:派生类有多个基类单继承:派生类只有一个基类直接基类间接基类4.2派生类的声明与实现classStudent1:publicStudent//声明基类是Student{private:intage;//新增加的数据成员stringaddr;//新增加的数据成员public:voiddisplay_1()//新增加的成员函数{coutage:ageendl;coutaddress:addrendl;}};从一个基类派生一个类的一般格式为:classClassName:AccessBaseClassName{private:......;//私有成员说明public:......;//公有成员说明protected:......;//保护成员说明}派生类名基类名继承方式派生类中新增加的成员类A派生类B:类A为基类,类B为派生类。AB但派生并不是简单的扩充,有可能改变基类的性质。有三种派生方式:公有派生、保护派生、私有派生。classB:publicA{...};classB:protectedA{...};classB:privateA{...};默认的是私有派生。classB:A{...};A为私有派生在建立派生类的过程中,基类不会做任何改变。派生类则除了继承基类的所有可引用的成员变量和成员函数外,还可另外定义本身的成员变量和处理这些变量的函数。由于派生类可继承基类的成员变量和成员函数,因此在基类中定义好的数据和函数等的程序代码可重复使用。4.3派生类的构成类A派生类B:类A为基类,类B为派生类。从基类接收成员(不包括构造函数和析构函数)调整从基类接收的成员声明派生类时增加的成员当从已有的类中派生出新的类时,可以对派生类做以下几种变化:1、可以继承基类的成员数据或成员函数。2、可以重新定义已有的成员函数。3、可以改变现有的成员访问属性。4、可以增加新的成员变量。5、可以增加新的成员函数。4.4派生类成员的访问属性类成员的访问权限:私有成员(private):可以被类自身的成员和友元访问,但不能被包括派生类在内的其他任何类和任何普通函数访问公有成员(public):可以被任何普通函数和任何类的成员函数访问保护成员(protected):可以被类自身的成员和友元访问外,还可以被派生类的成员函数访问,但不能被任何非友元的普通函数访问类的三种继承方式:公有继承(public):保护继承(protected):私有继承(private):继承方式常使用如下三种关键字给予表示:1.公有继承(public)基类的私有成员不能被派生类的函数成员访问基类的公有成员和保护成员在派生类中的访问权限不变2.私有继承(private)基类的私有成员不能被派生类的函数成员访问基类的公有成员和保护成员在派生类中的访问权限变为私有类型3.保护继承(protected)基类的私有成员不能被派生类的函数成员访问基类的公有成员和保护成员在派生类中的访问权限变为保护类型类的继承访问特性基类的访问特性类的继承特性子类的访问特性PublicProtectedPrivatePublicPublicProtectedNoaccessPublicProtectedPrivateProtectedProtectedProtectedNoaccessPublicProtectedPrivatePrivatePrivatePrivateNoaccess4.4.1公用继承classClassName:publicBaseClassName公有派生时,基类中所有成员在派生类中保持各个成员的访问权限。公有派生,派生类中保持基类的成员特性x(私有)y(保护)z(公有)A()Getx()Gety()ShowA()Ax(私有)y(保护)z(公有)A()Getx()Gety()ShowA()Bm(私有)n(私有)B()Show()Sum()publicx在类B新增加的成员中不能直接调用y在类B中可以调用z在整个文件中可以调用例4.1访问公有基类的成员#includeiostream#includestringusingnamespacestd;classStudent{public:voidget_value(){cinnumnamesex;}voiddisplay(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}private:intnum;stringname;charsex;};classStudent1:publicStudent{public:voidget_value_1(){cinageaddr;}voiddisplay_1(){//coutnum:numendl;//企图引用基类的私有成员,错误//coutname:nameendl;//企图引用基类的私有成员,错误//coutsex:sexendl;//企图引用基类的私有成员,错误coutage:ageendl;//引用派生类的私有成员,正确coutaddress:addrendl;}//引用派生类的私有成员,正确private:intage;stringaddr;};教材案例:请自行调试intmain(){Student1stud1;stud1.get_value();stud1.get_value_1();stud1.display();stud1.display_1();return0;}4.4.2私有继承classClassName:privateBaseClassName私有派生时,基类中公有成员和保护成员在派生类中均变为私有的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。私有派生,派生类中基类公有和保护成员成为私有基类:public:(变为私有)在派生类中使用,类外不可使用protected:(变为私有)在派生类中使用,类外不可使用private:不能在派生类中和类外使用x(私有)y(保护)z(公有)A()Getx()Gety()ShowA()Ax(私有)y(私有)z(私有)A()Getx()Gety()ShowA()Bm(私有)n(私有)B()Show()Sum()privatex在类B新增加的成员中不能直接调用y在类B中可以调用z在类B中可以调用均为私有类B外不能引用例4.2私有继承classStudent1:privateStudent{public:voiddisplay_1(){coutage:ageendl;//引用派生类的私有成员,正确coutaddress:addrendl;}//引用派生类的私有成员,正确private:intage;stringaddr;};intmain(){Student1stud1;stud1.display();stud1.display_1();stud1.age=18;return0;}例4.2私有继承classStudent1:privateStudent{public:voiddisplay_1(){display();coutage:ageendl;//引用派生类的私有成员,正确coutaddress:addrendl;}//引用派生类的私有成员,正确private:intage;stringaddr;};intmain(){Student1stud1;stud1.display_1();return0;}4.4.3保护继承classClassName:protectedBaseClassName保护派生时,基类中公有成员和保护成员在派生类中均变为保护的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。保护派生,派生类中基类公有和保护成员降级使用例4.3在派生类中引用保护成员#includeiostream#includestringusingnamespacestd;classStudent//声明基类{public://基类公用成员voiddisplay();protected://基类保护成员intnum;stringname;charsex;};voidStudent::display(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;}classStudent1:protectedStudent//用protected继承方式声明一个派生类{public:voiddisplay1();private:intage;stringaddr;};voidStudent1::display1(){coutnum:numendl;//引用基类的保护成员,合法coutname:nameendl;//引用基类的保护成员,合法coutsex:sexendl;//引用基类的保护成员,合法coutage:ageendl;//引用派生类的私有成员,合法coutaddress:addrendl;//引用派生类的私有成员,合法}intmai
本文标题:C++中的继承与派生
链接地址:https://www.777doc.com/doc-5368353 .html