C++面向对象程序设计讲义_第1页
C++面向对象程序设计讲义_第2页
C++面向对象程序设计讲义_第3页
C++面向对象程序设计讲义_第4页
C++面向对象程序设计讲义_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《C++面向对象程序设计》第四章内容4.1什么是运算符重载4.2运算符重载的方法4.3重载运算符的规则4.4运算符重载作为类成员函数和友元函数4.5重载双目运算符4.6重载单目运算符4.7重载流插入运算符和流提取运算符4.8不同类型数据间的转换2第5章继承和派生本章内容5.1继承和派生的概念5.2派生类的声明方法5.3派生类的构成5.4派生类成员的访问属性5.5派生类的构造函数和析构函数5.6多重继承5.7基类和派生类的转换5.8继承与组合4目标理解派生和继承的相关概念;掌握派生类的声明方式掌握派生类的构成和成员的访问属性;掌握派生类构造函数和析构函数的使用方法;掌握多重继承的方法;理解基类和派生类的转换方法;理解继承与组合的含义。55.1继承与派生的概念继承:继承是类之间定义的一种重要关系。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生65.1继承与派生的概念B类继承A类,或称从类A派生出B类,则A类称为基类(父类),类B称为派生类(子类)。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生75.1继承与派生的概念单继承:派生类从一个基类派生的继承关系。多继承:派生类从多个基类派生的继承关系。人学生老师大学生研究生硕士生博士生专科生本科生在职研究生85.1继承与派生的概念例:1、定义一个学生类Student,包括学生和姓名,以及显示信息的函数。2、定义一个大学生类CollegeStudent,包括学生、姓名和专业,以及显示信息的函数。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.2派派生类的的声明方式式声明派生类类的一般形形式为:class派生类类名:[继承方式]基类类名{派生类新增增成员;}继承方式::public、private和protected,默认为为private。。115.2派派生类的的声明方式式classCollegeStudent:publicStudent{public:voiddisplay1(){cout<<speciality;}private:stringspeciality;};基类的成员员在派生类类中如何存存在?125.3派派生类的的构成派生类的成成员包括从从基类继承过过来的成员员和自己增加的的成员两大部分。。CollegeStudentintnum;stringname;voiddisplay();stringspeciality;voiddispaly1();Studentintnum;stringname;voiddiaplsy();继承新增135.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;};例155.4派派生类成成员的访问问属性(一)公有有继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问16classStudent{public:voiddisplay(){cout<<num<<name;}private:intnum;stringname;};classCollegeStudent:publicStudent{public:voiddisplay1(){cout<<num<<name<<speciality;}private:stringspeciality;};找问题num和name在派生类中不不可访问。17classStudent{……};classCollegeStudent:publicStudent{public:voiddisplay1(){cout<<speciality;}private: stringspeciality;};voidmain(){CollegeStudents;s.display();s.display1();return0;}改正185.4派派生类成员的的访问属性(二)私有继继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问private成员private成员19classStudent{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{public:voiddisplay(){cout<<num<<name;}private:intnum;stringname;};classCollegeStudent:privateStudent{public:voiddisplay1(){display();cout<<speciality;}private:stringspeciality;};voidmain(){ CollegeStudents;s.display1();return0;}改正215.4派派生类成员的的访问属性(三)保护继继承public成员protected成员private成员public成员protected成员private成员基类派生类不可访问protected成员protected成员225.4派派生类成员的的访问属性(三)保护继继承由protected声声明的成员称称为受保护成员,简称保护成员。在同一类中保保护成员和私私有成员一样样,只能被类类内部的成员员函数访问,,而不能被类类外访问。保护成员可以以被派生类的成员员函数访问。23classStudent{ private:intnum;protected:stringname;};classCollegeStudent:protectedStudent{public:voiddisplay(){cout<<num;cout<<name;}};voidmain(){ CollegeStudents;s.display();=“Zhang”;return0;}找问题24总结类的成员的访访问属性Public:可以再类内内通过成员函函数来访问,,也可以在类类外通过对象象来访问。Private:只能再类内内通过成员函函数来访问Protected:只能再类内内通过成员函函数来访问25总结派生后成员访访问属性在派派生类中的变变化:原来在基类中中的访问属性性与上继承时的继继承方式,即即为基类成员员在派生类中中新的访问属属性。Class基类{public:成员j1protected:成成员j2private:成员j3};Class派生类:基基类{public:成员p1protected:成成员p2private:成员p3};public,j1,j226总结派生后成员访访问属性在派派生类中的变变化:原来在基类中中的访问属性性与上继承时的继继承方式,即即为基类成员员在派生类中中新的访问属属性。Class基类{public:成员j1protected:成成员j2private:成员j3};Class派生类:基基类{public:成员p1protected:成成员p2private:成员p3};Protected,j2,j127总结派生后成员访访问属性在派派生类中的变变化:原来在基类中中的访问属性性与上继承时的继继承方式,即即为基类成员员在派生类中中新的访问属属性。Class基类{public:成员j1protected:成成员j2private:成员j3};Class派生类:基基类{public:成员p1protected:成成员p2private:成员p3};private,j2,j128练习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练习例课后第一、、二、三、四四、五题305.5派派生类的构造造函数和析构构函数(一)简单派派生类的构造造函数简单派生类只只有一个基类类,数据成员员中不包括基基类的对象。。简单派生类构构造函数的定定义形式为::派生类构造函函数(总参数数列表):基基类构造函函数(参数列表){派生类中新增增数据成员初初始化;}31classStu{public:Stu(intn,stringna){num=n;name=na;}protected:intnum;stringname;};classColStu:publicStu{public:ColStu(intn,stringna,strings):Stu(n,na){ speciality=s;}voiddisplay(){cout<<num<<name<<speciality;}private:stringspeciality;};例325.5派派生生类类的的构构造造函函数数和和析析构构函函数数(一一))简简单单派派生生类类的的构构造造函函数数构造造函函数数的的执执行行顺顺序序::基类类的的构构造造函函数数。。派生生类类的的构构造造函函数数。。析构构函函数数的的执执行行顺顺序序::派生生类类的的析析构构函函数数。。基类类的的析析构构函函数数。。33简单单派派生生类类的的构构造造函函数数派生生类类构构造造函函数数((总总参参数数列列表表)):基基类类构构造造函函数数((参数数列列表表){派生生类类中中新新增增数数据据成成员员初初始始化化;;}构造造函函数数的的执执行行顺顺序序::基类类的的构构造造函函数数。。派生生类类的的构构造造函函数数。。析构构函函数数的的执执行行顺顺序序::派生生类类的的析析构构函函数数。。基类类的的析析构构函函数数。。345.5派派生生类类的的构构造造函函数数和和析析构构函函数数(二二))有有子对对象象的派派生生类类的的构构造造函函数数有子子对对象象的的派派生生类类是是指指类类的的成成员员包包括括类类的的对对象象。。classStu{protected:intnum;stringname;};classColStu:publicStu{public:voiddisplay();private:stringspeciality;Stus;};355.5派派生生类类的的构构造造函函数数和和析析构构函函数数(二二))有有子子对对象象的的派派生生类类的的构构造造函函数数有子子对对象象的的派派生生类类构构造造函函数数的的一一般般形形式式为为::派生生类类构构造造函函数数((总总参参数数列列表表)):基类类构构造造函函数数((参参数数列列表表)),子子对对象象名名((参参数数列列表表)){派生生类类中中新新增增数数据据成成员员初初始始化化;;}365.5派派生生类类的的构构造造函函数数和和析析构构函函数数(二二))有有子子对对象象的的派派生生类类的的构构造造函函数数构造造函函数数的的执执行行顺顺序序::基类类的的构构造造函函数数。。子对对象象的的构构造造函函数数。。派生生类类的的构构造造函函数数。。375.5派派生生类类的的构构造造函函数数和和析析构构函函数数classB{public:B(intbb){b=bb;}private:intb;};classC:publicB{public:C(intcc){c=cc;}private:BmemB;intc;};找问问题题 Cintb;//基类数据成员

intc;//新增数据成员

BmenB;//内嵌子对象

如何何初初始始化化??38classB{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);}例395.5派派生生类的的构造造函数数和析析构函函数(三))多层层派生生时的的构造造函数数一个类类不仅仅可以以派生生出一一个派派生类类,派派生类类还可可以继继续派派生,,形成成派生生的层层次结结构。。多层继继承时时的访访问属属性多层派派生时时的构构造函函数不不用列列出每每一层层派生生类的的构造造函数数,只只须写写出其其上一层层派生生类((即直接基基类)的构构造函函数即可。。40classA{public:A(intaa){a=aa;}private:inta;};classB:publicA{public:B(intaa,intbb):A(aa){b=bb;}private:intb;};classC:publicB{public:C(intaa,intbb,intcc):B(aa,bb){c=cc;}private:intc;};例415.5派派生生类的的构造造函数数和析析构函函数什么时时候在在声明明派生生类的的构造造函数数时需需要对对基类类或对对象成成员进进行初初始化化?如果派派生类类的基基类或或内嵌嵌子对对象所所属的的类中中没有有提供供默认认构造造函数数时,,派生生类需需要声声明构构造函函数,对继继承的的基类类成员员和内内嵌子子对象象的成成员进进行初初始化化。425.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);}例445.6多多重重继承承多重继继承::一个个派生生类同同时继继承多多个基基类。。455.6多多重重继承承(一))声明明多重重继承承的方方法class派派生类类名:[继承方方式]基类类名1,,[继承方方式]基类类名2,...,,[继承方方式]基类类名n{派生类类成员员声明明;};46classA{public:displayA{cout<<a;}inta;};classB{public:displayB{cout<<b;}intb;};classC:publicA,publicB{ public: displayC{cout<<c;}private:intc;};例47Cinta;intb;intc;voidDisplayA();voidDisplayB();voidDisplayC();Ainta;voidDisplayA();Bintb;voidDisplayB();5.6多多重继承承485.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;}50classB1{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);}例51(二)多重重继承派生生类的构造造函数格式:派生类构造造函数名((总参数列列表):基基类1构造造函数(参参数列表)),基类2构造函数数(参数列列表),子子对象1(参数数列表),,子对象2(参参数列表)){派生类中新新增数据成成员初始化化语句}注意:调用基类、、子对象的的构造函数数的顺序是是按照声明派生类类时基类、、子对象出出现的顺序序来调用的。。525.6多多重继承承(三)多重重继承引起起的二义性性问题classA{public:voiddisplay(){cout<<"A"<<endl;}};classB{public:voiddisplay(){cout<<"B"<<endl;}};classC:publicA,publicB{};voidmain(){Cc;c.display();}找问题535.6多多重继承承(三)多重重继承引起起的二义性性问题Avoiddisplay();Bvoiddisplay();CvoidA::display();voidB::display();Cc;c.display();Cc;

c.A::display();c.B::display();54classA{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多多重继承承55复习5.5派派生类的的构造函数数和析构函函数(一)简单单派生类的的构造函数数(二)有子对象的派生类的的构造函数数(三)多层层派生时的的构造函数数5.6多多重继承承(一)声明明多重继承承的方法(二)多重重继承派生生类的构造造函数(三)多重重继承引起起的二义性性问题56简单派生类类的构造函函数派生类构造造函数(总总参数列表表):基基类构造函函数(参数列表){派生类中新新增数据成成员初始化化;}构造函数的的执行顺序序:基类的构造造函数。派生类的构构造函数。。析构函数的的执行顺序序:派生类的析析构函数。。基类的析构构函数。57classStu{public:Stu(intn,stringna){num=n;name=na;}protected: intnum;stringname;};classColStu:publicStu{public:ColStu(intn,stringna,strings):Stu(n,na){ speciality=s;}voiddisplay(){ cout<<num<<name<<speciality; }private:stringspeciality;};例58(二)有子子对象的派派生类的构构造函数派生类构造造函数(总总参数列表表):基类构造函函数(参数数列表),子对象名名(参数列列表){派生类中新新增数据成成员初始化化;}构造函数的的执行顺序序:基类的构造造函数。子对象的构构造函数。。派生类的构构造函数。。59classB{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);}例60(三)多层层派生时的的构造函数数多层派生时时的构造函函数不用列列出每一层层派生类的的构造函数数,只须写写出其上一层派生生类(即直接基类)的构造函函数即可。61classA{ public: A(intaa){a=aa;}private:inta;};classB:publicA{public:B(intaa,intbb):A(aa){b=bb;}private:intb;};classC:publicB{public:C(intaa,intbb,intcc):B(aa,bb){c=cc;}private:intc;};例625.6多多重继承承(一)声明明多重继承承的方法class派生类类名:[继承方式]基类名1,[继承方式]基类名2,...,[继承方式]基类名n{派生类成员员声明;};63classA{ public: displayA{cout<<a;}inta;};classB{public:displayB{cout<<b;}intb;};classC:publicA,publicB{ public: displayC{cout<<c;}private:intc;};例64(二)多重重继承派生生类的构造造函数格式:派生类构造造函数名((总参数列列表):基基类1构造造函数(参参数列表)),基类2构造函数数(参数列列表),子子对象1(参数数列表),,子对象2(参参数列表)){派生类中新新增数据成成员初始化化语句}注意:调用基类、、子对象的的构造函数数的顺序是是按照声明派生类类时基类、、子对象出出现的顺序序来调用的。。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);}例665.6多多重继承(三)多重继继承引起的二二义性问题1、两个基类类有同名成员员2、两个基类类和派生类有有同名成员3、两个直接接基类都继承承于同一基类类675.6多多重继承(三)多重继继承引起的二二义性问题Avoiddisplay();Bvoiddisplay();CvoidA::display();voidB::display();Cc;c.display();Cc;

c.A::display();c.B::display();685.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()}例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多多重继承(四)虚基类类虚基类的作用用:可以使得得在继承间接接共同基类时时只保留一份份成员。虚基类是在派生类的声明过程中中声明的,一般形式式为:class派派生类名:virtual继承方式基基类名{派生类的定义义;}72classA{public:inta;voiddisplay(){cout<<a<<endl;}};classB:virtualpublicA{};classC:virtualpublicA{};classD:virtualpublicA{};classE:publicB,publicC,publicD{};voidmain(){Ee;e.a=1;e.display();}例为了保证虚基类的成员在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。735.6多多重继承(四)虚基类类初始化如果在虚基类类中定义了带带参数的构造造函数,且没有默认构造造函数,则在其所有直接或间接派生类中,都必须通通过初始化表表对虚基类进进行初始化。。74classA{public: A(intaa){a=aa;}private: inta;};classB:virtualpublicA{public: B(intaa,intbb):

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论