您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > c++程序设计第六章 继承与派生
1第六章继承和派生本章考核要求:1、掌握继承和派生的基本概念,达到“简单应用”层次。2、深刻理解单一继承的一般形式,达到“综合应用”层次。3、熟练掌握派生类的构造函数和析构函数的定义方法,达到“综合应用”层次。4、熟练掌握类的保护成员的定义方法,达到“综合应用”层次。5、深刻理解访问权限和赋值兼容规则,达到“综合应用”层次。6、理解多重继承,达到“领会”层次。2第六章继承和派生6.1继承和派生的基本概念一、“isa”和“has-a”的区别类与类之间的关系有两大类:1)一个类使用另一个(一个类的对象作为另一个类的数据成员)——“has-a”的关系。2)继承和派生——“isa”的关系3通过特殊化已有的类来建立新类的过程,称为“类的派生”,新产生的类为派生类,原来的类为基类。又可以分别叫做“子类”和“父类”他们之间是一种一般与特殊的关系继承关系是类与类之间的类属关系二、继承和派生人学生教师本科生硕士博士讲师副教授教授4从类的成员的角度看,派生类自动将基类的所有成员作为自己的成员,这叫做“继承”。也就是说,类的继承是指派生类继承基类的数据成员和成员函数。用来表示“类属”关系,而不是“构成”关系。人学生教师本科生硕士博士讲师副教授教授5当从现有类中派生出新类时,派生类可以有如下几种变化:3)改变基类的成员的访问权限。主要依靠派生类定义时的继承方式来控制。1)增加新成员(数据成员或成员函数)。这是继承与派生机制的核心,是保证派生类在功能上有所发展的关键。可以根据实际情况的需要,给派生类添加适当的数据成员和成员函数来完成必要的新增功能。2)重定义已有成员函数。这是对数据成员或成员函数的覆盖,就是在派生类中定义一个和基类数据成员或成员函数同名的成员,由于作用域不同,于是发生同名覆盖,基类中的成员就被替换成派生类中的同名成员。注意对于派生类中与基类同名的成员函数,它的参数表也必须和基类同名函数的一样,否则是重载,不能发生同名覆盖。6C++中有两种继承:单一继承、多重继承单一继承:派生类只能有一个基类。多重继承:派生类可以有多个基类。学生教师本科生硕士博士讲师副教授教授在职博士(单一继承)(多重继承)76.2单一继承一、单一继承的一般形式:class派生类名:访问控制基类名{派生类新定义成员}指示这个新类是哪个基类的派生类指如何控制基类成员在派生类中的访问属性,有:private、pretected、public三种。8#includeiostream//lt6_1.cppusingnamespacestd;classPoint{intx,y;public:Point(inta,intb){x=a;y=b;coutPoint...endl;}voidshowxy(){coutx=x,y=yendl;}~Point(){coutdeletePointendl;}};classRectangle:publicPoint{inth,w;public:Rectangle(inta,intb,intc,intd):Point(a,b){h=c;w=d;coutRectangle...endl;}voidshow(){couth=h,w=wendl;}~Rectangle(){coutdeleteRectangleendl;}};voidmain(){Rectanglea(3,4,5,6);a.showxy();a.show();}在派生类中继承的基类成员的初始化,需要由派生类的构造函数调用基类的构造函数来完成。公有继承Point类91)派生类,自动具有基类的所有成员,但构造函数和析构函数是不被继承的。2)当定义派生类的一个对象时,首先调用基类的构造函数,对基类成员进行初始化,然后执行派生类的构造函数。析构函数的执行顺序与此相反。二、派生类的构造函数和析构函数10练习:派生类的实例(lx6_1.cpp)有类human对象用于存放人的相关信息:姓名,年龄,性别并能利用成员函数实现相关信息输出。在此基础上定义类student类,除具有姓名,年龄,性别信息之外还具有学号、班级信息并能完成信息的输出显示。定义类,并设计测试程序。11#includeiostream#includestringusingnamespacestd;classhuman{private:stringname;intage;stringsex;public:human(stringa,intb,stringc){name=a;age=b;sex=c;cout人:name诞生了endl;}~human(){cout人:name析构了endl;}voidshowhuman(){coutname\tage\tsexendl;}voidset(stringa,intb,stringc){name=a;age=b;sex=c;}};voidmain(){humanhu(张红,20,女);hu.showhuman();}12在类human的基础上派生类student,增加新的数据成员:num(学号)和myclass(班级)必要的构造函数和析构函数显示学生信息的函数showstuclassstudent:publichuman{intnum;stringmyclass;public:student(stringa,intb,stringc,intd,stringe):human(a,b,c){num=d;myclass=e;cout学生:num诞生了endl;}~student(){cout学生:num析构了endl;}voidshowstu(){coutnum\tmyclassendl;}};13#includeiostream#includestringusingnamespacestd;classhuman{private:stringname;intage;stringsex;public:human(stringa,intb,stringc){name=a;age=b;sex=c;cout人:name诞生了endl;}~human(){cout人:name析构了endl;}voidshowhuman(){coutname\tage\tsexendl;}voidset(stringa,intb,stringc){name=a;age=b;sex=c;}};classstudent:publichuman{intnum;stringmyclass;public:student(stringa,intb,stringc,intd,stringe):human(a,b,c){num=d;myclass=e;cout学生:num诞生了endl;}~student(){cout学生:num析构了endl;}voidshowstu(){coutnum\tmyclassendl;}};voidmain(){humanhu(张红,20,女);hu.showhuman();studentstu(王林,21,男,1001,10级信一);stu.showhuman();stu.showstu();}student类自动具有human类的所有成员14classstudent:publichuman{intnum;stringmyclass;public:student(stringa,intb,stringc,intd,stringe):human(a,b,c){num=d;myclass=e;cout学生:num诞生了endl;}~student(){cout学生:num析构了endl;}voidshowstu(){coutnum\tmyclassendl;}};classhuman{private:stringname;intage;stringsex;public:human(stringa,intb,stringc){……}~human(){……}voidshowhuman(){……}voidset(stringa,intb,stringc){……}};voidmain(){studentstu(王林,21,男,1001,10级信一);stu.showhuman();stu.showstu();}namename思考:派生类中是否能使用基类中的私有成员?思考:派生类的对象为什么能够使用基类的公有成员关于继承方式和访问权限的问题showhumman();思考:派生类中能否使用基类的公有成员?15类的继承方式有3种:公有继承(public)、保护继承(protected)和私有继承(private)。不同的继承方式会导致原来具有不同访问属性的基类成员在派生类中的访问属性也有所不同。一是派生类中的新增成员对从基类继承来的成员的访问。二是派生类的对象对从基类继承来的成员的访问。基类的成员可以有、和3种访问权限,基类的自身成员可以访问自身类中的成员。但是通过基类的对象只能访问该类的成员。publicprotectedprivate所有public三、继承方式16(一)公有继承当类的继承方式为公有继承时,基类public和protected成员的访问属性在派生类中保持原来的访问属性不变,而基类private成员在派生类中不可访问,即基类的public和protected成员分别作为派生类的public和protected成员,派生类的其他成员可以直接访问。访问权限关系如下表(参见课本P137表6.1)基类的成员派生类的新增的成员基类对象和派生类对象外部函数private不可访问不可访问不可访问protectedprotected不可访问不可访问publicpublic可访问可访问注:protected类型的成员介于private和public之间。对派生类来讲,它的作用于public一样。但是对类的对象、外部函数来说,它与private一样,均是不可访问的,从而保持了类的封装性。17classstudent:publichuman{intnum;stringmyclass;public:student(stringa,intb,stringc,intd,stringe):human(a,b,c){num=d;myclass=e;cout学生:num诞生了endl;}~student(){cout学生:num析构了endl;}voidshowstu(){coutnum\tmyclassendl;}};classhuman{private:intage;stringsex;public:human(stringa,intb,stringc){……}~human(){……}voidshowhuman(){……}voidset(stringa,intb,stringc){……}};voidmain(){studentstu(王林,21,男,1001,10级信一);stu.showhuman();stu.showstu();}namename思考:派生类的对象为什么能够使用基类的公有成员思考:如何使基类的name成员可以在student类中被访问,但不能被对象和其他外部函数访问?protected:stringname;思考:派生类中是否能使用基类中的私有成员?不能18课程回顾1.基类中的protected成员,通过public派生,其在派生类中的可见性为()A.不可访问B.privateC.protectedD.public2.在派生类中继承的基类成员的初始化,需要由派生类的构造函数调用基类的来完成。3.在C++中,创建派生类
本文标题:c++程序设计第六章 继承与派生
链接地址:https://www.777doc.com/doc-3163655 .html