




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《C++面向对象程序设计》《C++面向对象程序设计》第四章内容4.1什么是运算符重载4.2运算符重载的方法4.3重载运算符的规则4.4运算符重载作为类成员函数和友元函数4.5重载双目运算符4.6重载单目运算符4.7重载流插入运算符和流提取运算符4.8不同类型数据间的转换2第四章内容4.1什么是运算符重载2第5章继承和派生第5章继承和派生本章内容5.1继承和派生的概念5.2派生类的声明方法5.3派生类的构成5.4派生类成员的访问属性5.5派生类的构造函数和析构函数5.6多重继承5.7基类和派生类的转换5.8继承与组合4本章内容5.1继承和派生的概念4目标理解派生和继承的相关概念;掌握派生类的声明方式掌握派生类的构成和成员的访问属性;掌握派生类构造函数和析构函数的使用方法;掌握多重继承的方法;理解基类和派生类的转换方法;理解继承与组合的含义。5目标理解派生和继承的相关概念;55.1继承与派生的概念继承:继承是类之间定义的一种重要关系。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生65.1继承与派生的概念人学生老师大学生研究生硕士生博士生5.1继承与派生的概念B类继承A类,或称从类A派生出B类,则A类称为基类(父类),类B称为派生类(子类)。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生75.1继承与派生的概念人学生老师大学生研究生硕士生博士生5.1继承与派生的概念单继承:派生类从一个基类派生的继承关系。多继承:派生类从多个基类派生的继承关系。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生85.1继承与派生的概念人学生老师大学生研究生硕士生博士生5.1继承与派生的概念例:1、定义一个学生类Student,包括学生和姓名,以及显示信息的函数。2、定义一个大学生类CollegeStudent,包括学生、姓名和专业,以及显示信息的函数。95.1继承与派生的概念例:95.1继承与派生的概念classStudent{public:voiddisplay(){cout<<num;cout<<name;}private:intnum;stringname;};classCollegeStudent{public:voiddisplay(){cout<<num;cout<<name;
cout<<speciality;}private:intnum;stringname;
stringspeciality;};能否在定义CollegeStudent时利用Student,而不用重新定义已有的成员?105.1继承与派生的概念classStudentcla5.2派生类的声明方式声明派生类的一般形式为:class派生类名:[继承方式]基类名{派生类新增成员;}继承方式:public、private和protected,默认为private。115.2派生类的声明方式声明派生类的一般形式为:115.2派生类的声明方式classCollegeStudent:publicStudent
{public: voiddisplay1() { cout<<speciality; }private: stringspeciality;};基类的成员在派生类中如何存在?125.2派生类的声明方式classCollegeStud5.3派生类的构成派生类的成员包括从基类继承过来的成员和自己增加的成员两大部分。CollegeStudentintnum;stringname;voiddisplay();stringspeciality;voiddispaly1();Studentintnum;stringname;voiddiaplsy();继承新增135.3派生类的构成派生类的成员包括从基类继承过来的成员和5.3派生类的构成派生类的生成过程:接收基类成员。派生类接收基类中除构造函数和析构函数之外的全部成员。改造基类成员。通过继承方式改造基类成员的访问控制权限;对基类成员进行覆盖,即在派生类中声明一个和基类数据或函数同名的成员。添加新的成员。145.3派生类的构成派生类的生成过程:14classStudent{public:
Student(intn,stringna){num=n;name=na;} ~Student(){} voidinput(){cin>>num>>name;} voiddisplay() {cout<<num<<name;}private: intnum;stringname;};classCollegeStudent:privateStudent{public: voiddisplay(){cout<<speciality;}private: stringspeciality;};例15classStudent例155.4派生类成员的访问属性(一)公有继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问165.4派生类成员的访问属性(一)公有继承public成classStudent{public: voiddisplay() {cout<<num<<name;}private: intnum;stringname;};classCollegeStudent:publicStudent{public: voiddisplay1()
{cout<<num<<name
<<speciality;}private: stringspeciality;};找问题num和name在派生类中不可访问。17classStudent找问题num和name在派生类中classStudent{…};classCollegeStudent:publicStudent{public:voiddisplay1(){cout<<speciality;}private: stringspeciality;};voidmain(){ CollegeStudents; s.display(); s.display1(); return0;}改正18classStudent{…};改正185.4派生类成员的访问属性(二)私有继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问private成员private成员195.4派生类成员的访问属性(二)私有继承public成classStudent{public:voiddisplay(){cout<<num<<name;}private:intnum;stringname;};classCollegeStudent:privateStudent{public:voiddisplay1(){cout<<speciality;}private:stringspeciality;};voidmain(){ CollegeStudents; s.display(); s.display1(); s.speciality=“Computer”; return0;}找问题20classStudent找问题20classStudent{public:voiddisplay(){cout<<num<<name;}private:intnum;stringname;};classCollegeStudent:privateStudent{public:voiddisplay1() {display();cout<<speciality;}private:stringspeciality;};voidmain(){ CollegeStudents; s.display1(); return0;}改正21classStudent改正215.4派生类成员的访问属性(三)保护继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问protected成员protected成员225.4派生类成员的访问属性(三)保护继承public成5.4派生类成员的访问属性(三)保护继承由protected声明的成员称为受保护成员,简称保护成员。在同一类中保护成员和私有成员一样,只能被类内部的成员函数访问,而不能被类外访问。保护成员可以被派生类的成员函数访问。235.4派生类成员的访问属性(三)保护继承23classStudent{ private: intnum; protected: stringname;};classCollegeStudent:protectedStudent{public:voiddisplay() {cout<<num;cout<<name;}};voidmain(){ CollegeStudents; s.display(); =“Zhang”; return0;}找问题24classStudent找问题24总结类的成员的访问属性Public:可以再类内通过成员函数来访问,也可以在类外通过对象来访问。Private:只能再类内通过成员函数来访问Protected:只能再类内通过成员函数来访问25总结类的成员的访问属性25总结派生后成员访问属性在派生类中的变化:原来在基类中的访问属性与上继承时的继承方式,即为基类成员在派生类中新的访问属性。Class基类{public:成员j1protected:成员j2private:成员j3};Class派生类:基类{public:成员p1protected:成员p2private:成员p3};public
,j1
,j226总结派生后成员访问属性在派生类中的变化:Class基类Cl总结派生后成员访问属性在派生类中的变化:原来在基类中的访问属性与上继承时的继承方式,即为基类成员在派生类中新的访问属性。Class基类{public:成员j1protected:成员j2private:成员j3};Class派生类:基类{public:成员p1protected:成员p2private:成员p3};Protected
,j2
,j127总结派生后成员访问属性在派生类中的变化:Class基类Cl总结派生后成员访问属性在派生类中的变化:原来在基类中的访问属性与上继承时的继承方式,即为基类成员在派生类中新的访问属性。Class基类{public:成员j1protected:成员j2private:成员j3};Class派生类:基类{public:成员p1protected:成员p2private:成员p3};private
,j2
,j128总结派生后成员访问属性在派生类中的变化:Class基类Cl练习classA//基类{public:inti;protected:voidf2();intj;private:intk;};classB:publicA//public方式{public:voidf3();protected:voidf4();private:intm;};classC:protectedB//protected方式{public:voidf5();private:intn;};29练习classA练习例课后第一、二、三、四、五题30练习例课后第一、二、三、四、五题305.5派生类的构造函数和析构函数(一)简单派生类的构造函数简单派生类只有一个基类,数据成员中不包括基类的对象。简单派生类构造函数的定义形式为:派生类构造函数(总参数列表):基类构造函数(参数列表){ 派生类中新增数据成员初始化;}315.5派生类的构造函数和析构函数(一)简单派生类的构造函classStu{public: Stu(intn,stringna){num=n;name=na;}protected: intnum; stringname;};classColStu:public
Stu
{public:
ColStu(intn,string
na,strings):Stu(n,na) { speciality=s; } voiddisplay() { cout<<num<<name<<speciality; }private: stringspeciality;};例32classStu例325.5派生类的构造函数和析构函数(一)简单派生类的构造函数构造函数的执行顺序:基类的构造函数。派生类的构造函数。析构函数的执行顺序:派生类的析构函数。基类的析构函数。335.5派生类的构造函数和析构函数(一)简单派生类的构造函简单派生类的构造函数派生类构造函数(总参数列表):基类构造函数(参数列表){ 派生类中新增数据成员初始化;}构造函数的执行顺序:基类的构造函数。派生类的构造函数。析构函数的执行顺序:派生类的析构函数。基类的析构函数。34简单派生类的构造函数派生类构造函数(总参数列表):基类构造5.5派生类的构造函数和析构函数(二)有子对象的派生类的构造函数有子对象的派生类是指类的成员包括类的对象。classStu{protected: intnum; stringname;};classColStu:publicStu{public: voiddisplay();private: stringspeciality;Stus;};355.5派生类的构造函数和析构函数(二)有子对象的派生类的5.5派生类的构造函数和析构函数(二)有子对象的派生类的构造函数有子对象的派生类构造函数的一般形式为:派生类构造函数(总参数列表):基类构造函数(参数列表),子对象名(参数列表){ 派生类中新增数据成员初始化;}365.5派生类的构造函数和析构函数(二)有子对象的派生类的5.5派生类的构造函数和析构函数(二)有子对象的派生类的构造函数构造函数的执行顺序:基类的构造函数。子对象的构造函数。派生类的构造函数。375.5派生类的构造函数和析构函数(二)有子对象的派生类的5.5派生类的构造函数和析构函数classB{public: B(intbb){b=bb;}private:intb;};classC:publicB{public: C(intcc){c=cc;}private: BmemB;intc;};找问题 Cintb;//基类数据成员
intc;//新增数据成员
BmenB;//内嵌子对象
如何初始化?385.5派生类的构造函数和析构函数classB找问题 classB{private:intb;public: B(intbb){b=bb;cout<<"B:"<<b<<endl;}};classC:publicB{public:
C(intaa,intbb,intcc):B(aa),memB(bb) {c=cc;cout<<"C:"<<c<<endl;}private: BmemB; intc;};voidmain(){Cc(1,2,3);}例39classB例395.5派生类的构造函数和析构函数(三)多层派生时的构造函数一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。多层继承时的访问属性多层派生时的构造函数不用列出每一层派生类的构造函数,只须写出其上一层派生类(即直接基类)的构造函数即可。405.5派生类的构造函数和析构函数(三)多层派生时的构造函classA{ public: A(intaa){a=aa;} private: inta;};classB:publicA{ public: B(intaa,intbb):A(aa){b=bb;} private:intb;};classC:public
B{ public: C(intaa,intbb,intcc):B(aa,bb) {c=cc;} private: intc;};例41classA例415.5派生类的构造函数和析构函数什么时候在声明派生类的构造函数时需要对基类或对象成员进行初始化?如果派生类的基类或内嵌子对象所属的类中没有提供默认构造函数时,派生类需要声明构造函数,对继承的基类成员和内嵌子对象的成员进行初始化。425.5派生类的构造函数和析构函数什么时候在声明派生类的构5.5派生类的构造函数和析构函数构造函数的执行顺序:基类的构造函数。子对象的构造函数。派生类的构造函数。析构函数的执行顺序:派生类的析构函数。子对象的析构函数。基类的析构函数。435.5派生类的构造函数和析构函数构造函数的执行顺序:43classA{public:A(intaa){a=aa;cout<<"A:"<<a<<endl;} ~A(){cout<<"~A"<<endl;}private:inta;};classB{public:B(intbb){b=bb;cout<<"B:"<<b<<endl;} ~B(){cout<<"~B"<<endl;}private:intb;};classC:publicB{public:C(intaa,intbb,intcc):B(bb),a(aa){c=cc;cout<<"C:"<<c<<endl;} ~C(){cout<<"~C"<<endl;}private:Aa;intc;}; voidmain(){Cc(1,2,3);}例44classA例445.6多重继承多重继承:一个派生类同时继承多个基类。455.6多重继承多重继承:一个派生类同时继承多个基类。455.6多重继承(一)声明多重继承的方法class派生类名:[继承方式]基类名1,[继承方式]基类名2,...,[继承方式]基类名n{ 派生类成员声明;};465.6多重继承(一)声明多重继承的方法46classA{ public: displayA{cout<<a;} inta;};classB{ public: displayB{cout<<b;} intb;};classC:publicA,publicB{ public: displayC{cout<<c;} private: intc;};例47classA例47Cinta;intb;intc;voidDisplayA();voidDisplayB();voidDisplayC();Ainta;voidDisplayA();Bintb;voidDisplayB();5.6多重继承48CAB5.6多重继承485.6多重继承(二)多重继承派生类的构造函数多继承下的构造函数和析构函数与单继承下的构造函数和析构函数是相似的,派生类的构造函数需要对基类成员、内嵌子对象和新增成员进行初始化。495.6多重继承(二)多重继承派生类的构造函数49classA{public:A(intaa=0){a=aa;}private:inta;};classB{public:B(intbb=0){b=bb;}private:intb;};classC:publicA,publicB{public:private:Aa;Bb;intc;};构造函数C(inta1,inta2,intb1,intb2,intcc):A(a1),a(a2),B(b1),b(b2){c=cc;}50classA构造函数C(inta1,inta2,intclassB1{public:B1(inti){cout<<"B1"<<i<<endl;}};classB2{public:B2(intj){cout<<"B2"<<j<<endl;}};classB3{public:B3(){cout<<"B3*"<<endl;}};classC:publicB2,publicB1,publicB3{public:C(inta,intb,intc,intd):B1(a),memB2(d),memB1(c),B2(b){}private:B1memB1;B2memB2;B3memB3;};voidmain(){Cobj(1,2,3,4);}例51classB1例51(二)多重继承派生类的构造函数格式:派生类构造函数名(总参数列表):基类1构造函数(参数列表),基类2构造函数(参数列表),子对象1(参数列表),子对象2(参数列表){派生类中新增数据成员初始化语句}注意:调用基类、子对象的构造函数的顺序是按照声明派生类时基类、子对象出现的顺序来调用的。52(二)多重继承派生类的构造函数525.6多重继承(三)多重继承引起的二义性问题classA{public:voiddisplay(){cout<<"A"<<endl;}};classB{public:voiddisplay(){cout<<"B"<<endl;}};classC:publicA,publicB{};voidmain(){Cc;c.display();}找问题535.6多重继承(三)多重继承引起的二义性问题class5.6多重继承(三)多重继承引起的二义性问题Avoiddisplay();Bvoiddisplay();CvoidA::display();voidB::display();Cc;
c.display();Cc;
c.A::display();c.B::display();545.6多重继承(三)多重继承引起的二义性问题ABCCcclassA{public:voiddisplay(){cout<<"A"<<endl;}};classB{public:voiddisplay(){cout<<"B"<<endl;}};classC:publicA,publicB{public:voiddisplay(){cout<<"C"<<endl;}};voidmain(){Cc;c.display();}5.6多重继承55classA5.6多重继承55复习5.5派生类的构造函数和析构函数(一)简单派生类的构造函数(二)有子对象的派生类的构造函数(三)多层派生时的构造函数5.6多重继承(一)声明多重继承的方法(二)多重继承派生类的构造函数(三)多重继承引起的二义性问题56复习5.5派生类的构造函数和析构函数56简单派生类的构造函数派生类构造函数(总参数列表):基类构造函数(参数列表){ 派生类中新增数据成员初始化;}构造函数的执行顺序:基类的构造函数。派生类的构造函数。析构函数的执行顺序:派生类的析构函数。基类的析构函数。57简单派生类的构造函数派生类构造函数(总参数列表):基类构造classStu{public: Stu(intn,stringna){num=n;name=na;}protected: intnum; stringname;};classColStu:public
Stu
{public:
ColStu(intn,string
na,strings):Stu(n,na) { speciality=s; } voiddisplay() { cout<<num<<name<<speciality; }private: stringspeciality;};例58classStu例58(二)有子对象的派生类的构造函数派生类构造函数(总参数列表):基类构造函数(参数列表),子对象名(参数列表){ 派生类中新增数据成员初始化;}构造函数的执行顺序:基类的构造函数。子对象的构造函数。派生类的构造函数。59(二)有子对象的派生类的构造函数派生类构造函数(总参数列表)classB{private:intb;public: B(intbb){b=bb;cout<<"B:"<<b<<endl;}};classC:publicB{public:
C(intaa,intbb,intcc):B(aa),memB(bb) {c=cc;cout<<"C:"<<c<<endl;}private: BmemB; intc;};voidmain(){Cc(1,2,3);}例60classB例60(三)多层派生时的构造函数多层派生时的构造函数不用列出每一层派生类的构造函数,只须写出其上一层派生类(即直接基类)的构造函数即可。61(三)多层派生时的构造函数61classA{ public: A(intaa){a=aa;} private: inta;};classB:publicA{ public: B(intaa,intbb):A(aa){b=bb;} private:intb;};classC:public
B{ public: C(intaa,intbb,intcc):B(aa,bb) {c=cc;} private: intc;};例62classA例625.6多重继承(一)声明多重继承的方法class派生类名:[继承方式]基类名1,[继承方式]基类名2,...,[继承方式]基类名n{ 派生类成员声明;};635.6多重继承(一)声明多重继承的方法63classA{ public: displayA{cout<<a;} inta;};classB{ public: displayB{cout<<b;} intb;};classC:publicA,publicB{ public: displayC{cout<<c;} private: intc;};例64classA例64(二)多重继承派生类的构造函数格式:派生类构造函数名(总参数列表):基类1构造函数(参数列表),基类2构造函数(参数列表),子对象1(参数列表),子对象2(参数列表){派生类中新增数据成员初始化语句}注意:调用基类、子对象的构造函数的顺序是按照声明派生类时基类、子对象出现的顺序来调用的。65(二)多重继承派生类的构造函数65classB1{public:B1(inti){cout<<"B1"<<i<<endl;}};classB2{public:B2(intj){cout<<"B2"<<j<<endl;}};classB3{public:B3(){cout<<"B3*"<<endl;}};classC:publicB2,publicB1,publicB3{public:C(inta,intb,intc,intd):B1(a),memB2(d),memB1(c),B2(b){}private:B1memB1;B2memB2;B3memB3;};voidmain(){Cobj(1,2,3,4);}例66classB1例665.6多重继承(三)多重继承引起的二义性问题1、两个基类有同名成员2、两个基类和派生类有同名成员3、两个直接基类都继承于同一基类675.6多重继承(三)多重继承引起的二义性问题675.6多重继承(三)多重继承引起的二义性问题Avoiddisplay();Bvoiddisplay();CvoidA::display();voidB::display();Cc;
c.display();Cc;
c.A::display();c.B::display();685.6多重继承(三)多重继承引起的二义性问题ABCCc5.6多重继承(三)多重继承引起的二义性问题派生类新增加的同名成员将覆盖基类中的同名成员。695.6多重继承(三)多重继承引起的二义性问题69classA{public: voiddisplay(){cout<<a<<endl;}};classB:publicA{};classC:publicA{};classD:publicB,publicC{public:voiddisplay(){cout<<a<<endl;}};voidmain(){Dd;d.display();//D类的display()
c.B::display();//B类从A类继承的display()
c.C::display();//C类从A类继承的display()}例70classA例705.6多重继承Ainta;voiddisplay();EintB::a;intC::a;intD::a;voidB::display();voidC::display();voidD::display();BintA::a;voidA::display();DintA::a;voidA::display();CintA::a;voidA::display();E中能否只保留一份A的a和display()?715.6多重继承AEBDCE中能否只保留一份A的a和dis5.6多重继承(四)虚基类虚基类的作用:可以使得在继承间接共同基类时只保留一份成员。虚基类是在派生类的声明过程中声明的,一般形式为:class派生类名:virtual继承方式基类名{派生类的定义;}725.6多重继承(四)虚基类72classA{public:inta; voiddisplay(){cout<<a<<endl;}};classB:virtualpublicA{};classC:virtual
publicA{};classD:virtual
publicA{};classE:publicB,publicC,publicD{};voidmain(){Ee;e.a=1;e.display();}例为了保证虚基类的成员在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。73classA{例为了保证虚基类的成员在派生类中只继承一次,5.6多重继承(四)虚基类初始化如果在虚基类中定义了带参数的构造函数,且没有默认构造函数,则在其所有直接或间接派生类中,都必须通过初始化表对虚基类进行初始化。745.6多重继承(四)虚基类初始化74classA{public: A(intaa){a=aa;}private: inta;};classB:virtualpublicA{public: B(intaa,intbb):A(aa){b=bb;}private: intb;};classC:virtualpublicA{public: C(intaa,intcc):A(aa){c=cc;}private: intc;};classD:publicB,publicC{public:D(intaa,intbb,intcc,intdd):A(aa),B(aa,bb),C(aa,cc){d=dd;}private: intd;};例75classA例755.7基类与派生类的转换派生类对象可以向基类对象赋值。classA{ public: inta; };classB:publicA{ public: intb; };voidmain(){ Aobja; Bobjb;
obja=objb; obja.a=7; // obja.b=8;//}只能访问子类继承父类的成员,而不能访问子类新增的成员。765.7基类与派生类的转换派生类对象可以向基类对象赋值。c派生类对象可以初始化基类的引用。5.7基类与派生类的转换classA{ public: inta; };classB:publicA{ public: intb; };voidmain(){ Bobjb;
A&r=objb; r.a=7;}robjbinta;intb;r只是objb中基类部分的别名,与objb中基类部分共享同一存储单元。77派生类对象可以初始化基类的引用。5.7基类与派生类的转换派生类对象的地址可以赋给指向基类的指针。5.7基类与派生类的转换classA{ public: inta; };classB:publicA{ public: intb; };voidmain(){ Bobjb;
A*p=&objb; p->a=7;}p只能访问objb中基类成员a,而不能访问objb中新增加的成员b。78派生类对象的地址可以赋给指向基类的指针。5.7基类与派生类的组合:在一个类中以另一个类的对象作为数据成员。5.8继承与组合classTeacher{private: intnum; stringname;};classBirthDate{private: intyear,month,day;};classProfessor:publicTeacher{private: BirthDatebirthday;};79类的组合:在一个类中以另一个类的对象作为数据成员。5.8继承建立了派生类与基类之间的一种“是”的关系,是纵向的。组合建立了成员类和组合类(复合类)之间的一种“有”的关系,是横向的。5.8继承与组合80继承建立了派生类与基类之间的一种“是”的关系,是纵向的。5.总结本章主要讲授内容继承和派生的概念派生类的声明方法派生类的构成和成员的访问属性派生类构造函数和析构函数多重继承基类与派生类的转换继承与组合81总结本章主要讲授内容81目标理解派生和继承的相关概念;掌握派生类的声明方式掌握派生类的构成和成员的访问属性;掌握派生类构造函数和析构函数的使用方法;掌握多重继承的方法;理解基类和派生类的转换方法;理解继承与组合的含义。82目标理解派生和继承的相关概念;82练习课后第七、八题以点(point)类为基类,派生类圆类,圆由圆心和半径定义。派生类操作判断任一坐标点是在图形内,还是在图形的边缘上,还是在图形外。83练习课后第七、八题83演讲完毕,谢谢观看!演讲完毕,谢谢观看!《C++面向对象程序设计》《C++面向对象程序设计》第四章内容4.1什么是运算符重载4.2运算符重载的方法4.3重载运算符的规则4.4运算符重载作为类成员函数和友元函数4.5重载双目运算符4.6重载单目运算符4.7重载流插入运算符和流提取运算符4.8不同类型数据间的转换86第四章内容4.1什么是运算符重载2第5章继承和派生第5章继承和派生本章内容5.1继承和派生的概念5.2派生类的声明方法5.3派生类的构成5.4派生类成员的访问属性5.5派生类的构造函数和析构函数5.6多重继承5.7基类和派生类的转换5.8继承与组合88本章内容5.1继承和派生的概念4目标理解派生和继承的相关概念;掌握派生类的声明方式掌握派生类的构成和成员的访问属性;掌握派生类构造函数和析构函数的使用方法;掌握多重继承的方法;理解基类和派生类的转换方法;理解继承与组合的含义。89目标理解派生和继承的相关概念;55.1继承与派生的概念继承:继承是类之间定义的一种重要关系。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生905.1继承与派生的概念人学生老师大学生研究生硕士生博士生5.1继承与派生的概念B类继承A类,或称从类A派生出B类,则A类称为基类(父类),类B称为派生类(子类)。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生915.1继承与派生的概念人学生老师大学生研究生硕士生博士生5.1继承与派生的概念单继承:派生类从一个基类派生的继承关系。多继承:派生类从多个基类派生的继承关系。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生925.1继承与派生的概念人学生老师大学生研究生硕士生博士生5.1继承与派生的概念例:1、定义一个学生类Student,包括学生和姓名,以及显示信息的函数。2、定义一个大学生类CollegeStudent,包括学生、姓名和专业,以及显示信息的函数。935.1继承与派生的概念例:95.1继承与派生的概念classStudent{public:voiddisplay(){cout<<num;cout<<name;}private:intnum;stringname;};classCollegeStudent{public:voiddisplay(){cout<<num;cout<<name;
cout<<speciality;}private:intnum;stringname;
stringspeciality;};能否在定义CollegeStudent时利用Student,而不用重新定义已有的成员?945.1继承与派生的概念classStudentcla5.2派生类的声明方式声明派生类的一般形式为:class派生类名:[继承方式]基类名{派生类新增成员;}继承方式:public、private和protected,默认为private。955.2派生类的声明方式声明派生类的一般形式为:115.2派生类的声明方式classCollegeStudent:publicStudent
{public: voiddisplay1() { cout<<speciality; }private: stringspeciality;};基类的成员在派生类中如何存在?965.2派生类的声明方式classCollegeStud5.3派生类的构成派生类的成员包括从基类继承过来的成员和自己增加的成员两大部分。CollegeStudentintnum;stringname;voiddisplay();stringspeciality;voiddispaly1();Studentintnum;stringname;voiddiaplsy();继承新增975.3派生类的构成派生类的成员包括从基类继承过来的成员和5.3派生类的构成派生类的生成过程:接收基类成员。派生类接收基类中除构造函数和析构函数之外的全部成员。改造基类成员。通过继承方式改造基类成员的访问控制权限;对基类成员进行覆盖,即在派生类中声明一个和基类数据或函数同名的成员。添加新的成员。985.3派生类的构成派生类的生成过程:14classStudent{public:
Student(intn,stringna){num=n;name=na;} ~Student(){} voidinput(){cin>>num>>name;} voiddisplay() {cout<<num<<name;}private: intnum;stringname;};classCollegeStudent:privateStudent{public: voiddisplay(){cout<<speciality;}private: stringspeciality;};例99classStudent例155.4派生类成员的访问属性(一)公有继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问1005.4派生类成员的访问属性(一)公有继承public成classStudent{public: voiddisplay() {cout<<num<<name;}private: intnum;stringname;};classCollegeStudent:publicStudent{public: voiddisplay1()
{cout<<num<<name
<<speciality;}private: stringspeciality;};找问题num和name在派生类中不可访问。101classStudent找问题num和name在派生类中classStudent{…};classCollegeStudent:publicStudent{public:voiddisplay1(){cout<<speciality;}private: stringspeciality;};voidmain(){ CollegeStudents; s.display(); s.display1(); return0;}改正102classStudent{…};改正185.4派生类成员的访问属性(二)私有继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问private成员private成员1035.4派生类成员的访问属性(二)私有继承public成classStudent{public:voiddisplay(){cout<<num<<name;}private:intnum;stringname;};classCollegeStudent:privateStudent{public:voiddisplay1(){cout<<speciality;}private:stringspeciality;};voidmain(){ CollegeStudents; s.display(); s.display1(); s.speciality=“Computer”; return0;}找问题104classStudent找问题20classStudent{public:voiddisplay(){cout<<num<<name;}private:intnum;stringname;};classCollegeStudent:privateStudent{public:voiddisplay1() {display();cout<<speciality;}private:stringspeciality;};voidmain(){ CollegeStudents; s.display1(); return0;}改正105classStudent改正215.4派生类成员的访问属性(三)保护继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问protected成员protected成员1065.4派生类成员的访问属性(三)保护继承public成5.4派生类成员的访问属性(三)保护继承由protected声明的成员称为受保护成员,简称保护成员。在同一类中保护成员和私有成员一样,只能被类内部的成员函数访问,而不能被类外访问。保护成员可以被派生类的成员函数访问。1075.4派生类成员的访问属性(三)保护继承23classStudent{ private: intnum; protected: stringname;};classCollegeStudent:protectedStudent{public:voiddisplay() {cout<<num;cout<<name;}};voidmain(){ CollegeStudents; s.display(); =“Zhang”; return0;}找问题108classStudent找问题24总结类的成员的访问属性Public:可以再类内通过成员函数来访问,也可以在类外通过对象来访问。Private:只能再类内通过成员函数来访问Protected:只能再类内通过成员函数来访问109总结类的成员的访问属性25总结派生后成员访问属性在派生类中的变化:原来在基类中的访问属性与上继承时的继承方式,即为基类成员在派生类中新的访问属性。Class基类{public:成员j1protected:成员j2private:成员j3};Class派生类:基类{public:成员p1protected:成员p2private:成员p3};public
,j1
,j2110总结派生后成员访问属性在派生类中的变化:Class基类Cl总结派生后成员访问属性在派生类中的变化:原来在基类中的访问属性与上继承时的继承方式,即为基类成员在派生类中新的访问属性。Class基类{public:成员j1protected:成员j2private:成员j3};Class派生类:基类{public:成员p1protected:成员p2private:成员p3};Protected
,j2
,j1111总结派生后成员访问属性在派生类中的变化:Class基类Cl总结派生后成员访问属性在派生类中的变化:原来在基类中的访问属性与上继承时的继承方式,即为基类成员在派生类中新的访问属性。Class基类{public:成员j1protected:成员j2private:成员j3};Class派生类:基类{public:成员p1protected:成员p2private:成员p3};private
,j2
,j1112总结派生后成员访问属性在派生类中的变化:Class基类Cl练习classA//基类{public:inti;protected:voidf2();intj;private:intk;};classB:publicA//public方式{public:voidf3();protected:voidf4();private:intm;};classC:protectedB//protected方式{public:voidf5();private:intn;};113练习classA练习例课后第一、二、三、四、五题114练习例课后第一、二、三、四、五题305.5派生类的构造函数和析构函数(一)简单派生类的构造函数简单派生类只有一个基类,数据成员中不包括基类的对象。简单派生类构造函数的定义形式为:派生类构造函数(总参数列表):基类构造函数(参数列表){ 派生类中新增数据成员初始化;}1155.5派生类的构造函数和析构函数(一)简单派生类的构造函classStu{public: Stu(intn,stringna){num=n;name=na;}protected: intnum; stringname;};classColStu:public
Stu
{public:
ColStu(intn,string
na,strings):Stu(n,na) { speciality=s; } voiddisplay() { cout<<num<<name<<speciality; }private: stringspeciality;};例116classStu例325.5派生类的构造函数和析构函数(一)简单派生类的构造函数构造函数的执行顺序:基类的构造函数。派生类的构造函数。析构函数的执行顺序:派生类的析构函数。基类的析构函数。1175.5派生类的构造函数和析构函数(一)简单派生类的构造函简单派生类的构造函数派生类构造函数(总参数列表):基类构造函数(参数列表){ 派生类中新增数据成员初始化;}构造函数的执行顺序:基类的构造函数。派生类的构造函数。析构函数的执行顺序:派生类的析构函数。基类的析构函数。118简单派生类的构造函数派生类构造函数(总参数列表):基类构造5.5派生类的构造函数和析构函数(二)有子对象的派生类的构造函数有子对象的派生类是指类的成员包括类的对象。classStu{protected: intnum; stringname;};classColStu:publicStu{public: voiddisplay();private: stringspeciality;Stus;};1195.5派生类的构造函数和析构函数(二)有子对象的派生类的5.5派生类的构造函数和析构函数(二)有子对象的派生类的构造函数有子对象的派生类构造函数的一般形式为:派生类构造函数(总参数列表):基类构造函数(参数列表),子对象名(参数列表){ 派生类中新增数据成员初始化;}1205.5派生类的构造函数和析构函数(二)有子对象的派生类的5.5派生类的构造函数和析构函数(二)有子对象的派生类的构造函数构造函数的执行顺序:基类的构造函数。子对象的构造函数。派生类的构造函数。1215.5派生类的构造函数和析构函数(二)有子对象的派生类的5.5派生类的构造函数和析构函数classB{public: B(intbb){b=bb;}private:intb;};classC:publicB{public: C(intcc){c=cc;}private: BmemB;intc;};找问题 Cintb;//基类数据成员
intc;//新增数据成员
BmenB;//内嵌子对象
如何初始化?1225.5派生类的构造函数和析构函数classB找问题 classB{private:intb;public: B(intbb){b=bb;cout<<"B:"<<b<<endl;}};classC:publicB{public:
C(intaa,intbb,intcc):B(aa),memB(bb) {c=cc;cout<<"C:"<<c<<endl;}private: BmemB; intc;};voidmain(){Cc(1,2,3);}例123classB例395.5派生类的构造函数和析构函数(三)多层派生时的构造函数一个类不仅可以派生出一个派生类,派生类还可以继续派生,形成派生的层次结构。多层继承时的访问属性多层派生时的构造函数不用列出每一层派生类的构造函数,只须写出其上一层派生类(即直接基类)的构造函数即可。1245.5派生类的构造函数和析构函数(三)多层派生时的构造函classA{ public: A(intaa){a=aa;} private: inta;};classB:publicA{ public: B(intaa,intbb):A(aa){b=bb;} private:intb;};classC:public
B{ public: C(intaa,intbb,intcc):B(aa,bb) {c=cc;} private: intc;};例125classA例415.5派生类的构造函数和析构函数什么时候在声明派生类的构造函数时需要对基类或对象成员进行初始化?如果派生类的基类或内嵌子对象所属的类中没有提供默认构造函数时,派生类需要声明构造函数,对继承的基类成员和内嵌子对象的成员进行初始化。1265.5派生类的构造函数和析构函数什么时候在声明派生类的构5.5派生类的构造函数和析构函数构造函数的执行顺序:基类的构造函数。子对象的构造函数。派生类的构造函数。析构函数的执行顺序:派生类的析构函数。子对象的析构函数。基类的析构函数。1275.5派生类的构造函数和析构函数构造函数的执行顺序:43classA{public:A(intaa){a=aa;cout<<"A:"<<a<<endl;} ~A(){cout<<"~A"<<endl;}private:inta;};classB{public:B(intbb){b=bb;cout<<"B:"<<b<<endl;} ~B(){cout<<"~B"<<endl;}private:intb;};classC:publicB{public:C(intaa,intbb,intcc):B(bb),a(aa){c=cc;cout<<"C:"<<c<<endl;} ~C(){cout<<"~C"<<endl;}private:Aa;intc;}; voidmain(){Cc(1,2,3);}例128classA例445.6多重继承多重继承:一个派生类同时继承多个基类。1295.6多重继承多重继承:一个派生类同时继承多个基类。455.6多重继承(一)声明多重继承的方法class派生类名:[继承方式]基类名1,[继承方式]基类名2,...,[继承方式]基类名n{ 派生类成员声明;};1305.6多重继承(一)声明多重继承的方法46classA{ public: displayA{cout<<a;} inta;};classB{ public: displayB{cout<<b;} intb;};classC:publicA,publicB{ public: displayC{cout<<c;} private: intc;};例131classA例47Cinta;intb;intc;voidDisplayA();voidDisplayB();voidDisplayC();Ainta;voidDisplayA();Bintb;voidDisplayB();5.6多重继承132CAB5.6多重继承485.6多重继承(二)多重继承派生类的构造函数多继承下的构造函数和析构函数与单继承下的构造函数和析构函数是相似的,派生类的构造函数需要对基类成员、内嵌子对象和新增成员进行初始化。1335.6多重继承(二)多重继承派生类的构造函数49classA{public:A(intaa=0){a=aa;}private:inta;};classB{public:B(intbb=0){b=bb;}private:intb;};classC:publicA,publicB{public:private:Aa;Bb;intc;};构造函数C(inta1,inta2,intb1,intb2,intcc):A(a1),a(a2),B(b1),b(b2){c=cc;}134classA构造函数C(inta1,inta2,intclassB1{public:B1(inti){cout<<"B1"<<i<<endl;}};classB2{public:B2(intj){cout<<"B2"<<j<<endl;}};classB3{public:B3(){cout<<"B3*"<<endl;}};classC:publicB2,publicB1,publicB3{public:C(inta,intb,intc,intd):B1(a),memB2(d),memB1(c),B2(b){}private:B1memB1;B2memB2;B3memB3;};voidmain()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度艺术展览经纪人聘用合同(艺术作品展览)
- 2025版汽车贷款担保合同编写与执行标准范本
- 二零二五年度环保项目咨询与治理服务合同
- 二零二五年度智能家居灯具安装及售后服务合同范本模板
- 二零二五年度跨境电商平台入驻保证金合同
- 2025版国际艺术品交易合同及其鉴定磋商规定
- 2025版服装店长聘用合同范本:行业发展趋势应对
- 二零二五年度货车驾驶员劳动合同解除及补偿合同
- 2025版内燃机发动机批量订购协议书
- 2025版拆除工程废弃物处理与资源化利用合同范本
- 2025至2030中国沉淀硫酸钡行业产业运行态势及投资规划深度研究报告
- 2025年北京市社区工作者招聘笔试考试题库及答案解析
- 火灾事故桌面演练记录
- 2025年北京市中考数学真题
- 新入职员工职业素养培训
- 2024江西交通职业技术学院招聘笔试真题含答案详解
- 运动队训练计划的大数据制定与优化
- DZ/T 0179-1997地质图用色标准及用色原则(1∶50 000)
- 抖音店铺运营试题及答案
- 数据中心机房基础设施运维管理全新体系
- 《神经根型颈椎病的诊断与治疗》课件
评论
0/150
提交评论