您好,欢迎访问三七文档
1第七章继承与派生清华大学郑莉C++语言程序设计C++语言程序设计清华大学郑莉2本章主要内容类的继承与派生类成员的访问控制单继承与多继承派生类的构造、析构函数类成员的标识与访问C++语言程序设计清华大学郑莉3类的继承与派生保持已有类的特性而构造新类的过程称为继承在已有类的基础上新增自己的特性而产生新类的过程称为派生继承和派生的目的是保持已有类的特性并构造新类,二者意思实质相同,只是着眼点不同被继承的已有类称为基类(或父类)派生出的新类称为派生类(或子类)C++语言程序设计清华大学郑莉4继承与派生问题举例工具车轿车面包车小汽车卡车旅行车汽车交通工具类的继承与派生反映交通工具的派生关系的分类树C++语言程序设计清华大学郑莉5继承与派生问题举例猴子狮子虎猎豹猫鸟动物类的继承与派生反映动物派生关系的分类树C++语言程序设计清华大学郑莉6继承与派生问题举例圆矩形几何形状类的继承与派生反映几何形状派生关系的分类树C++语言程序设计清华大学郑莉7继承与派生问题举例兼职技术人员销售经理管理人员销售人员雇员类的继承与派生反映公司人员派生关系的分类树C++语言程序设计清华大学郑莉8继承与派生的目的继承的目的:实现代码重用。派生的目的:实现代码扩充。当新的问题出现,原有程序无法解决(或不能完全解决)时,需对原有程序进行改造。类的继承与派生C++语言程序设计清华大学郑莉9派生类的声明class派生类名:继承方式基类名{派生类成员声明;}类的继承与派生继承方式:规定了如何访问从基类继承的成员派生类成员:指除了从基类继承来的所有成员之外新增加的数据和函数成员C++语言程序设计清华大学郑莉10派生类生成过程经历三个步骤:1.吸收基类成员除构造函数和析构函数之外的所有成员2.改造基类成员对基类成员的访问控制问题:继承方式对基类成员的同名覆盖问题:同名隐藏规则3.添加新的成员构造函数和析构函数等类的继承与派生C++语言程序设计清华大学郑莉11继承方式不同继承方式的影响主要体现在:–派生类成员对基类成员的访问权限–派生类对象对基类成员的访问权限三种继承方式–公有继承//权限最宽泛–私有继承//权限最窄–保护继承//权限介于两者之间类成员的访问控制C++语言程序设计清华大学郑莉12公有继承(public)基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。类成员的访问控制C++语言程序设计清华大学郑莉13例7-1公有继承举例classPoint//基类Point类的声明{public://公有函数成员voidInitP(floatxx=0,floatyy=0){X=xx;Y=yy;}voidMove(floatxOff,floatyOff){X+=xOff;Y+=yOff;}floatGetX(){returnX;}floatGetY(){returnY;}private://私有数据成员floatX,Y;};类成员的访问控制classRectangle:publicPoint//派生类声明{public://新增公有函数成员voidInitR(floatx,floaty,floatw,floath){InitP(x,y);//调用基类公有成员函数W=w;H=h;}floatGetH(){returnH;}floatGetW(){returnW;}private://新增私有数据成员floatW,H;};14#includeiostream#includecmathusingnamespacestd;intmain(){Rectanglerect;//派生类对象rect.InitR(2,3,20,10);//访问派生类的公有成员//通过派生类对象访问基类的公有成员rect.Move(3,2);coutrect.GetX()','rect.GetY()','rect.GetH()','//访问派生类的公有成员rect.GetW()endl;//访问派生类的公有成员return0;}15C++语言程序设计清华大学郑莉16私有继承(private)基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。类成员的访问控制C++语言程序设计清华大学郑莉17例7-2私有继承举例classRectangle:privatePoint//派生类声明{public://新增外部接口voidInitR(floatx,floaty,floatw,floath){InitP(x,y);W=w;H=h;}//访问基类公有成员voidMove(floatxOff,floatyOff)//同名成员{Point::Move(xOff,yOff);}floatGetX(){returnPoint::GetX();}//同名成员floatGetY(){returnPoint::GetY();}//同名成员floatGetH(){returnH;}floatGetW(){returnW;}private://新增私有数据floatW,H;};类成员的访问控制#includeiostream#includecmathusingnamespacestd;intmain(){Rectanglerect;//派生类对象//通过派生类对象只能访问本类公有成员rect.InitR(2,3,20,10);rect.Move(3,2);coutrect.GetX()','rect.GetY()','rect.GetH()','rect.GetW()endl;return0;}18C++语言程序设计清华大学郑莉19保护继承(protected)基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员类成员的访问控制C++语言程序设计清华大学郑莉20protected成员的特点与作用横向来看,即从类外来看,对建立其所在类对象的模块来说,它与private成员的性质相同。纵向来看,即对于类的派生类来说,它与public成员的性质相同。既实现了数据隐藏,又可以共享数据,方便继承,实现代码重用。类成员的访问控制C++语言程序设计清华大学郑莉21例7-3protected成员举例classA{protected:intx;}intmain(){Aa;//A类的对象a.x=5;//错误}类成员的访问控制classA{protected:intx;}classB:publicA{//派生类public:voidFunction();};voidB:Function(){x=5;//正确}2223继承方式小结:在派生的过程中,不同的继承方式,对基类有不同的存取权,如下所示:在派生基类类中继承方式在基类中的private成员在基类中的protected成员在基类中的public成员private私有不能存取作为派生类中的private成员作为派生类中的private成员protected保护不能存取作为派生类中的protected成员作为派生类中的protected成员public公有不能存取作为派生类中的protected成员作为派生类中的public成员派生类中的成员函数,不可以存取基类中的private私有成员可以存取基类中的protected保护成员、public公有成员派生类声明的对象可以存取1)本身类中的公共成员2)以public公有方式派生过来的基类中的公共成员C++语言程序设计清华大学郑莉24基类与派生类的对应关系单继承–派生类只从一个基类派生。多继承–派生类从多个基类派生。多重派生–由一个基类派生出多个不同的派生类。多层派生–派生类又作为基类,继续派生新的类。单继承与多继承C++语言程序设计清华大学郑莉25多继承时派生类的声明class派生类名:继承方式1基类名1,继承方式2基类名2,...{派生类成员声明;}注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。单继承与多继承C++语言程序设计清华大学郑莉26多继承举例classA{public:voidsetA(int);voidshowA();private:inta;};classB{public:voidsetB(int);voidshowB();private:intb;};classC:publicA,privateB{public:voidsetC(int,int,int);voidshowC();private:intc;};单继承与多继承voidA::setA(intx){a=x;}voidB::setB(intx){b=x;}voidC::setC(intx,inty,intz){//派生类成员直接访问基类的//公有成员setA(x);setB(y);c=z;}//其它函数实现略intmain(){Cobj;//派生类对象//访问公有继承的基类的公有成员obj.setA(5);obj.showA();//直接访问本类的公有成员obj.setC(6,7,9);obj.showC();//不可访问私有继承的基类成员//obj.setB(6);错误//obj.showB();错误return0;}2728派生类可继承基类的内容如下所示:派生类数据成员成员函数重载运算符自己的数据成员自己的成员函数自己的构造函数自己的析构函数基类数据成员成员函数构造函数析构函数除=外的重载运算符继承的成员可继承可继承无法继承无法继承可继承C++语言程序设计清华大学郑莉29继承时的构造函数基类的构造函数不被继承,派生类中需要声明自己的构造函数。声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。派生类的构造函数需要给基类的构造函数传递参数派生类的构造、析构函数C++语言程序设计清华大学郑莉30单一继承时的构造函数派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表){本类成员初始化赋值语句;};派生类的构造、析构函数基类:直接基类本类成员:本类新增成员执行顺序:先执行基类成员的初始化,再执行函数体C++语言程序设计清华大学郑莉31单一继承时的构造函数举例#includeiostreamusingnamespacestd;classB{public:B();B(inti);~B();voidPrint()const;private:intb;};派生类的构造、析构函数B::B()//默认构造函数{b=0;coutB'sdefaultconstructorcalled.endl;}B::B(inti)//带参数的构造函数{b=i;coutB'sconstructorcalled.endl;}B::~B()//析构函数{coutB'sdestructorcalled.endl;}voidB::Print()const//输出函数{coutbendl;}32classC:publicB{public:C();C(inti,intj);~C();voidPrint()const;private:intc;};33C::C()//默认
本文标题:C++-继承与派生
链接地址:https://www.777doc.com/doc-5368390 .html