您好,欢迎访问三七文档
1第8章继承与派生2目录8.1继承和派生的概念8.2派生类成员的访问控制8.3派生类的构造函数和析构函数8.4多重继承38.1继承与派生的概念继承就是新的类从已有类得到已有的属性与服务(即从已有类产生新类的过程)。已有类称为基类或父类产生的新类称为派生类或子类从基类产生派生类的方法有2种:单继承只允许一个派生类从一个唯一的基类继承产生多重继承(或多继承)允许一个派生类从两个或两个以上的基类中继承产生利用类的“继承”,可以将原来的程序代码重复使用,从而减少了程序代码的冗余度,符合软件重用的目标。基类:派生类:大学学生大学生研究生大专生本科生博士生硕士生研究生职工在职研究生48.1继承与派生——派生类的声明单继承是从现有的一个基类创建一个新类的过程定义单继承的格式:class派生类名:[public/private/protected]基类名{派生类数据成员和函数成员定义}已有的类继承原有类特性而生成的新类继承方式,默认为privateclassStudent{public:intnum;charname[10];charsex;voiddisplay();};classStudent1:publicStudent{public:intage;;charaddr[20];voiddisplay();};5classStudent{public:intnum;charname[10];charsex;voiddisplay();};classStudent1:publicStudent{public:intage;;charaddr[20];voiddisplay();};8.1继承与派生——派生类的声明派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。intage;charaddr[30];voiddisplay();68.2派生类成员的访问控制——公有继承公有继承、私有继承、保护继承基类的公用成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。类访问控制符从自身类访问从派生类访问从类外部的对象访问public是是是protected是是否private是否否7例公有继承访问规则的例子。#includeiostream.hclassParent//基类{public:intpubD;protected:intprotD;private:intprivD;};classSon:publicParent//公有继承{public:voidfn(){intx;x=pubD;//有效x=protD;//有效x=privD;}//错误};voidmain(){Parentp;p.pubD=10;p.protD=10;//错误p.privD=10;//错误Sons;//派生类对象s.pubD=20;//有效s.protD=20;//错误s.privD=20;//错误}派生类可直接访问基类的公有和保护成员外部对象不能直接访问自身和基类的私有和保护成员类访问控制符从自身类访问从派生类访问从类外部的对象访问public是是是protected是是否private是否否88.2派生类成员的访问控制——私有继承除基类的私有成员将继承为派生类的私有成员外,基类的公有成员和保护成员也将成为派生类的私有成员。类访问控制符从自身类访问从派生类访问从类外部的对象访问public是是否protected是是否private是否否9例私有继承的例子。#includeiostream.hclassParent//基类{protected:intx;public:voidsetx(){x=0;}voiddisplay(){coutx=xendl;}};classSon:privateParent//派生类{public:voidincrease()//新增成员函数{x++;}};voidmain(){Sons;s.setx();//错误s.increase();//有效s.display();//错误}类访问控制符从自身类访问从派生类访问从类外部的对象访问public是是否protected是是否private是否否108.2派生类成员的访问控制——保护继承除基类的私有成员将继承为派生类的私有成员外,基类的公有成员和保护成员将成为派生类的保护成员。类访问控制符从自身类访问从派生类访问从类外部的对象访问public是是否protected是是否private是否否11例类的保护成员的使用。#includeiostream.hclassdemo{protected:intj;public:demo(){j=0;}voidadd(inti){j+=i;}voidsub(inti){j-=i;}voiddisplay(){cout当前j的值:jendl;}};classchild:protecteddemo{public:voidsub(inti){j-=i-2;}voidshow(){display();}};voidmain(){childobject;//object.display();object.show();//object.add(10);object.sub(5);object.show();}当派生类与基类有同名成员函数时,派生类成员屏蔽基类的128.3派生类的构造函数和析构函数派生类构造函数和析构函数的执行顺序1.派生类中不含对象成员构造函数的执行顺序:先执行基类的构造函数,再执行派生类的构造函数析构函数的执行顺序:先执行派生类的析构函数,再执行基类的析构函数派生类不含对象成员的构造函数格式:派生类构造函数名(参数表):基类构造函数(参数表){新增成员初始化语句;}其中基类构造函数的参数通常来源于派生类构造函数的参数表13例派生类构造函数与析构函数的执行顺序的例子#includeiostream.hclassStudent{public:Student(){cout构造Student\n;}~Student(){cout析构Student\n;}};classStu:publicStudent{public:Stu(){cout构造Stu\n;}~Stu(){cout析构Stu\n;}};voidmain(){Stutp;}14例派生类不含对象成员时构造函数的参数传递#includeiostream.hclassStudent{intx;public:Student(intn){cout构造student\n;x=n;}~Student(){cout析构student\n;}voidshowx(){coutxendl;}};classStu:publicStudent{inty;public:Stu(intn,intm):Student(m){cout构造Stu\n;y=n;}~Stu(){cout析构Stu\n;}voidshowy(){coutyendl;}};voidmain(){Stutp(10,20);tp.showx();tp.showy();}基类与派生类都有数据成员,构造时它们都需要初始化158.3派生类的构造函数和析构函数派生类构造函数和析构函数的执行顺序1.派生类中不含对象成员2.派生类中含对象成员构造函数的执行顺序:先执行基类的构造函数,再执行对象成员的构造函数,最后执行派生类的构造函数析构函数的执行顺序:先执行派生类的析构函数,再执行对象成员的析构函数,最后执行基类的析构函数派生类含对象成员的构造函数格式:派生类构造函数名(参数表):基类构造函数(参数表),对象成员1(参数表),…,对象成员n(参数表){新增成员初始化语句(不包括对象成员);}16例派生类含对象成员时构造函数的参数传递#includeiostream.hclassA{private:inta;public:A(inti){a=i;cout构造A\n;}~A(){cout析构A\n;}voidPrint(){couta,;}intGeta(){returna;}};classB:publicA{private:intb;Aaa;//aa为基类对象public:B(inti,intj,intk):A(i),aa(j){b=k;cout构造B\n;}~B(){cout析构B\n;}voidPrint(){A::Print();coutb,aa.Geta()endl;}};voidmain(){Bbb1(3,4,5);bb1.Print();}B的数据成员:a继承A的成员b派生的成员aa对象成员B的成员函数与A同名,所以A的Print被屏蔽,若要调用之,需使用A::限定178.4多重继承——概念一个派生类同时继承多个基类,称为多重继承继承语法:classTeacher{};classStudent{};classTeach_Assistant:publicTeacher,publicStudent{…};TeacherStudent基类基类Teacher_Assistant派生类多重继承派生类的声明格式:class派生类名:派生方式1基类名1,派生方式2基类名2,…{派生类新增的数据成员和函数成员};冒号后面是基类表,各基类之间用逗号分隔188.4多重继承——引用举例例声明一个教师(Teacher)类和一个学生(Student)类,用多重继承的方式声明一个助教(Teach_Assistant)派生类。教师类中包括数据成员name(姓名)、age(年龄)、title(职称)。学生类中包括数据成员name1(姓名)、age(性别)、score(成绩)。在定义派生类对象时给出初始化的数据,然后输出这些数据。中南大学信息科学与工程学院王小玲201119基类使用保护类数据成员,便于继承基类的构造函数#includeiostream.h#includestring.hclassTeacher{public:Teacher(char*n,inta,char*t){name=n;age=a;title=t;}voiddisplay(){cout姓名:nameendl;cout年龄:ageendl;cout职称:titleendl;}protected:char*name;intage;char*title;};classStudent{public:Student(char*n,chars,floatsc){name1=n;sex=s;score=sc;}voiddisplay1(){cout姓名:name1endl;cout性别:sexendl;cout成绩:scoreendl;}protected:char*name1;charsex;floatscore;};中南大学信息科学与工程学院王小玲201120classT_A:publicTeacher,publicStudent{public:T_A(char*n,inta,chars,char*t,floatsc,floatw):Teacher(n,a,t),Student(n,s,sc),wage(w){}voidshow(){cout姓名:nameendl;cout年龄:ageendl;cout性别:sexendl;cout成绩:scoreendl;cout职称:titleendl;cout工资:wageendl;}private:floatwage;};voidmain(){T_Ata1(王丽,24,'f',助教,89.5,1234.5);ta1.show();}姓名n,年龄a,职称t,初始化Teacher姓名n,性别s,成绩sc,初始化Stud
本文标题:第8章_继承与派生
链接地址:https://www.777doc.com/doc-2112946 .html