C++继承

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第十二章继承继承和派生交通工具汽车卡车小汽车旅行车工具车轿车面包车轮船飞机ShapeShape2DShape3DCircleTriangleRectangleSphereCubeTetrahedron通过继承,可以从已有的类派生出新类,新类在已有类的基础上新增自己的特性;被继承的已有类称为基类(父类),派生出的新类称为派生类(子类);继承可以减少代码的冗余性,实现代码的重用,并且通过作少量的修改,满足不断变化的具体应用要求,提高程序设计的灵活性;派生类的定义class派生类名:继承方式基类名1,…{成员定义;}基类与派生类的关系是相对的;多继承:一个派生类有多个直接基类;单继承:一个派生类只有一个直接基类;ABCclassStudent{protected:intnumber;charname[20];floatscore;public:Student(intnum=0,char*p=noname){number=num;strcpy(name,p);}voidSetScore(floats=0.0){score=s;}};classGraduateStudent:publicStudent{protected:charadvisor[20];public:voidSetAdvisor(char*p){strcpy(advisor,p);}char*GetAdvisor(){returnadvisor;}};voidmain(){Students1(1001,Lucy);GraduateStudents2;s2.SetScore(85.0);s2.SetAdvisor(Mary);}StudentGradusteStudent继承方式继承方式指定了派生类成员以及类外对象对继承来的成员的访问权限。三种继承方式:公有继承(public);保护继承(protected);私有继承(private);公有继承(public)将基类的protected区成员继承到派生类的protected区,基类的public区的成员继承到派生类的public区;派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员;外部函数中,派生类的对象只能访问基类的public成员。保护继承(protected)将基类的protected区和public区的所有成员都继承到派生类的protected区;派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员;外部函数中,派生类的对象不能访问基类中的任何成员;私有继承(private)将基类的protected区和public区的所有成员都继承到派生类的private区;派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员;外部函数中,派生类的对象不能访问基类中的任何成员;未加注明的情况下都指private继承方式;publicprotectedprivatepublicpublicprotectedprivateprotectedprotectedprotectedprivateprivateprivateprivateprivate访问继承protected成员的特点与作用classA{protected:intx;};intmain(){Aa;a.x=5;//错误}classA{protected:intx;};classB:publicA{public:voidFunction();};voidB::Function(){x=5;//正确}公有继承举例classLocation{public:voidInitL(intxx,intyy){X=xx;Y=yy;}voidMove(intxOff,intyOff){X+=xOff;Y+=yOff;}intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};classRectangle:publicLocation//派生类{public:voidInitR(intx,inty,intw,inth);intGetH(){returnH;}intGetW(){returnW;}private:intW,H;};inlinevoidRectangle::InitR(intx,inty,intw,inth){InitL(x,y);//派生类直接访问基类的公有成员W=w;H=h;}intmain(){Rectanglerect;rect.InitR(2,3,20,10);rect.Move(3,2);//对象访问基类的公有成员coutrect.GetX()','//对象访问基类的公有成员rect.GetY()','rect.GetH()','rect.GetW()endl;return0;}私有继承举例classRectangle:privateLocation{public:voidInitR(intx,inty,intw,inth);voidMove(intxOff,intyOff);intGetX();intGetY();intGetH(){returnH;}intGetW(){returnW;}private:intW,H;};inlinevoidRectangle::InitR(intx,inty,intw,inth){InitL(x,y);//派生类直接访问原公有成员W=w;H=h;}voidRectangle::Move(intxOff,intyOff){Location::Move(xOff,yOff);}intRectangle::GetX(){returnLocation::GetX();}intRectangle::GetY(){returnLocation::GetY();}intmain(){Rectanglerect;rect.InitR(2,3,20,10);rect.Move(3,2);//对象访问派生类的函数coutrect.GetX()‘,‘//对象访问派生类的函数rect.GetY()','rect.GetH()','rect.GetW()endl;return0;}继承中的构造函数和析构函数派生类不继承基类的构造函数和析构函数,但是能调用基类的构造函数和析构函数;派生类的构造函数总是先调用基类的构造函数来初始化派生类中的基类成员,再进行派生类中成员的初始化;派生类构造函数的定义中,要提供基类构造函数所需要的参数。如果派生类没有用户自定义的构造函数,执行其默认构造函数时,首先调用基类的构造函数;析构函数的调用顺序和构造函数的调用顺序相反;子类的构造函数要有一个默认的父类的构造函数对应classBase{public:Base(inti);~Base();voidprint();private:inta;};classDerive:publicBase{public:Derive(inti,intj);~Derive();voidprint();private:intb;};例1Base::Base(inti){a=i;coutBaseconstructorendl;}Base::~Base(){coutBasedestructorendl;}voidBase::print(){coutaendl;}Derive::Derive(inti,intj):Base(i){b=j;coutDeriveconstructorendl;}Derive::~Derive(){coutDerivedestructorendl;}voidDerive::print(){Base::print();coutbendl;}:a(i)×voidmain(){Derived(2,5);d.print();}BaseconstructorDeriveconstructor25DerivedestructorBasedestructor例2classBase{public:Base();Base(inti);......};classDerive:publicBase{public:Derive(inti,intj){}......};例3classBase{public:Base(){coutBaseconstructorendl;}~Base(){coutBasedestructorendl;}voidprint();};classDerive:publicBase{public:voidset(inti){b=i;}voidprint(){coutbendl;}private:intb;};voidmain(){Derived;d.set(2);d.print();}Baseconstructor2Basedestructor组合与继承组合:一个类的数据成员是另一个类的对象;继承和组合都利用了已经定义的类,但是类之间关系上有差别;构造函数的调用顺序:调用基类构造函数;调用各成员对象的构造函数,调用顺序按照它们在类中声明的顺序。执行派生类的构造函数体中的内容;classBase{inta;public:Base(inti){a=i;coutBaseconstructorendl;}~Base(){coutBasedestructorendl;}voidprint(){coutaendl;}};classMember{intb;public:Member(intj){b=j;coutMemberconstructorendl;}~Member(){coutMemberdestructorendl;}voidprint(){coutbendl;}};classDerive:publicBase{intc;Membermem;public:Derive(inti,intj,intk):mem(j),Base(i){c=k;coutDeriveconstructorendl;}~Derive(){coutDerivedestructorendl;}voidprint(){Base::print();mem.print();coutcendl;}};voidmain(){Derived(2,3,4);d.print();}BaseconstructorMemberconstructorDeriveconstructor234DerivedestructorMemberdestructorBasedestructorclassBase{inta;public:Base(inti):a(i){}};classDerive:publicBase{intb;public:Derive(inti):b(i*15),Base(b){}};voidmain(){Derived(10);}赋值兼容原则一个公有继承的派生类对象可以隐式转化为一个基类对象:用派生类的对象给基类对象赋值;用派生类的对象来初始化基类的引用;把派生类对象的地址赋值给指向基类的指针;把指向派生类对象的指针赋值给指向基类对象的指针;访问范围基类对象不能代替派生类对象;基类成员派生类成员classA{public:voidprint1(){}};classB:publicA{public:voidprint2(){}};Bbp1,*pbp;Aap1=bp1;//OKA&ap2=bp1;//OKA*ptr=&bp1;//OKptr=pbp;//OKptr-print1();//OKptr-print2()

1 / 80
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功