您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > C++-类的继承和派生ppt
-第四章继承和派生-4.1继承和派生的概念面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。在本章中主要介绍有关继承的知识,在下一章中将介绍多态性。C++语言提供了类的继承机制,解决了软件重用问题。4.1.1继承与派生的概念一个类中包含了若干数据成员和成员函数。在不同的类中,数据成员和成员函数是不相同的。但有时两个类的内容基本相同或有一部分相同。-类的继承:一个新类从已存在的类那里获得该类已有的特性叫作类的继承。已存在的类叫作父类,也叫作基类。产生的新类叫作子类或派生类。类的派生:从一个已有的类那里产生一个新类的过程叫类的派生。已存在的类叫作父类,也叫作基类。产生的新类叫作派生类或子类。类的继承和派生是同一概念,前者是从子类的角度来说,后者是从父类的角度来说的。我们通常说子类继承了父类。父类派生了子类。-描述各级学生的类的继承关系如下图:基类与派生类的关系:派生类是基类的具体化,基类则是派生类的抽象一个派生类的对象也是一个基类的对象。应该具有基类的一切属性和方法。派生类除了具有基类的一切属性和方法外,还可以有自己所特有的属性和方法。4.1.2派生类和基类的关系-4.1.3单继承与多继承单继承:一个派生类只从一个基类继承。多重继承:一个派生类从两个或多个基类继承。-4.2派生类的声明方式声明派生类的一般形式为class派生类名:[继承方式]基类名{派生类新增加的成员};继承方式包括:public(公有的),private(私有的)和protected(受保护的),此项是可选的,如果不写此项,则默认为private(私有的)。如下程序演示了类Rectangle(四边形)由类Point继承而来。-voidSetPoint(intx,inty){this-x=x;this-y=y;}voidMovePoint(intdx,intdy){x+=dx;y+=dy;}voidShowPoint(){cout'('x','y')';}};//Point.h#includeiostream#includecmathusingnamespacestd;classPoint{private:intx,y;public:intGetX(){returnx;}intGetY(){returny;}-voidSetRect(intx,inty,intw,inth){SetPoint(x,y);width=w;height=h;}voidShowRect(){cout左上角坐标为:;ShowPoint();coutendl;cout宽为:widthendl;cout长为:heightendl;}};//Rectangle.h#includeiostream#includePoint.husingnamespacestd;classRectangle:publicPoint{private:intwidth;intheight;public:intGetWidth(){returnwidth;}intGetHight(){returnheight;}-//main.cpp#includeRectangle.hvoidmain(){Rectangler;r.SetRect(0,0,10,20);r.ShowRect();r.MovePoint(10,10);r.ShowRect();}-4.3派生类的构成派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。在基类中包括数据成员和成员函数(或称数据与方法)两部分,派生类分为两大部分:一部分是从基类继承来的成员,另一部分是在声明派生类时增加的部分。每一部分均分别包括数据成员和成员函数。基类(Point)intx;inty;GetX();GetY();SetPoint();MovePoint();ShowPoint();数据成员成员函数派生类(Rectangle)intx;inty;GetX();GetY();SetPoint();MovePoint();ShowPoint();继承intwidth;intheight;GetWidth();GetHeight();SetRect();ShowRect();新增-如果在派生类中定义了和基类中同名函数(函数参数个数和类型可以相同也可以不相同),则派生类中的函数会隐藏基类的同名函数。在派生类中不能直接访问基类中的同名函数。(注意与重载的区别。在同一个类中的同名不同参函数为重载函数)如程序PointRect1所示:-4.4继承方式派生类的继承方式有三种:public,private,protected。不同的继承方式决定了基类成员在派生类中的访问属性。继承方式基类中的访问属性派生类中的访问属性publicpublicpublicprotectedprotectedprivate不可访问privatepublicprivateprotectedprivateprivate不可访问protectedpublicprotectedprotectedprotectedprivate不可访问-4.4.1类的保护成员前面介绍过类的成员(数据成员和成员函数)的访问属性有私有的(private)的和公有的(public的)。另外还提到类的访问属性也可以有保护的(protected的)。类中的protected成员与private成员一样,只能在本类的成员函数中访问,不能在类外通过对象来访问。但通过上面的表中可以看出当类派生时,基类的private成员在派生类中是不可访问的。而基类的protected成员在派生类中随继承方式的不同而不同。-classDrived:publicBase{protected:intj;public:voidFun(){i=20;}};#includeiostreamusingnamespacestd;classBase{protected:inti;public:voidF(){}};voidmain(){Drivedd;}-4.5派生类的构造函数和析构函数构造函数的主要作用是对数据成员初始化。在设计派生类的构造函数时,不仅要考虑派生类所增加的数据成员的初始化,还应当考虑基类的数据成员初始化。也就是说,希望在执行派生类的构造函数时,使派生类的数据成员和基类的数据成员同时都被初始化。解决这个问题的思路是:在执行派生类的构造函数时,调用基类的构造函数注意:派生类继承基类的除构造函数和析构函数以外的所有函数。-4.4.1简单的派生类的构造函数简单的派生类:只有一个基类,而且只有一级派生(只有直接派生类,没有间接派生类),在派生类的数据成员中不包含基类的对象(即子对象)。简单派生类中我们一般采用在派生类的构造函数初始化列表中调用基类的构造函数来对继承基类的数据成员进行初始化。其一般形式为:派生类构造函数名(总参数表列):基类构造函数名(参数表列){派生类中新增数据成员初始化语句}1、简单派生类的构造函数的形式-#includeiostream#includestringusingnamespacestd;classStudent{public:Student(intn,stringnam,chars){num=n;name=nam;sex=s;}~Student(){}protected:intnum;stringname;charsex;};-classStudent1:publicStudent{public:Student1(intn,stringnam,chars,inta,stringad):Student(n,nam,s){age=a;addr=ad;}voidshow(){coutnum:numendl;coutname:nameendl;coutsex:sexendl;coutage:ageendl;coutaddress:addrendlendl;}~Student1(){}private:intage;stringaddr;};-在main函数中,建立对象stud1时指定了5个实参。它们按顺序传递给派生类构造函数Student1的形参。然后,派生类构造函数将前面3个传递给基类构造函数的形参。-2、简单派生类的构造函数的几点说明a.定义派生类的对象时系统自动调用派生类构造函数之前会先调用其基类的构造函数。基类的构造函数是在派生类的构造函数的初始化列表中给出。如果在初始化列表中没显式给出调用语句则调用基类的默认构造函数。例如前例中派生类的构造函数为:Student1(intn,stringnam,chars,inta,stringad):Student(n,nam,s)如果在main函数中定义一个Student1类的对象时。系统会先调用基类的构造函数。然后执行Student1的构造函数体内的代码完成对派生类成员的构造。如果Student1类的构造函数改为Student1(intn,stringnam,char)则会先调用基类的默认构造函数。-3.当派生类构造函数在类外定义时,则只在类外的函数定义处加上调用基类的初始化列表。在类内申明的地方不加4.由前面例题中的构造函数Student1(intn,stringnam,chars,inta,stringad):Student(n,nam,s)可以看出派生类的构造函数的初始化列表中是在调用基类的构造函数而不是在申明或定义基类的构造函数。所以Student1中的五个参数是形参(带参数类型),而其初始化列表中的Student的三个参数是实参(不带有类型),这些实参取自Student1,所以Studen中的三个参数也可以为常数。例如可将Student1的构造函数改为:Student1(stringnam,chars,inta,stringad):Student(10010,nam,s);5.在派生类对象释放时先执行派生类的析构函数,然后执行基类的析构函数。-例题:定义一个点类Point.由Point派生出一个圆类Circle//Point.h文件#ifndefPOINT_H#definePOINT_HclassPoint{protected:floatx;floaty;public:Point(){x=0;y=0;}Point(floatx,floaty);voidShow();};#endif//Point.cpp文件#includeiostream#includePoint.husingnamespacestd;Point::Point(floatx,floaty){this-x=x;this-y=y;}voidPoint::Show(){cout(x,y)endl;}-//Circle.h文件#ifndefCIRCLE_H#defineCIRCLE_H#includeiostream#includePoint.husingnamespacestd;classCircle:publicPoint{protected:floatr;public:Circle(floatx,floaty,floatr);voidShow();floatGetArea();floatGetLength();};#endif//Circle.cpp文件#includeiostream#includeCirCle.husingnamespacestd;Circle::Circle(floatx,floaty,floatr):Point(x,y){this-r=r;}voidCircle::Show(){cout圆心为:;Point(x,y).Show();cout半径为:rendl;}floatCircle::GetArea(){return3.14159*r*r;}floatCircle::Ge
本文标题:C++-类的继承和派生ppt
链接地址:https://www.777doc.com/doc-7228745 .html