您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > c++11上海交大(针对谭浩强的书)
前一页休息第4篇面向对象的程序设计第十一章继承与派生C++语言程序设计计算机基础教学研究室面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特征——继承性和多态性。在本章中主要介绍有关继承的知识,在第12章中将介绍多态性。面向对象技术强调软件的可重用性(softwarereusability)。C++语言提供了类的继承机制,解决了软件重用问题。继承11.1继承与派生的概念计算机系人员学生研究生本科生系主任行政管理人员教务教师教职工基类(父类)派生类(子类)多继承单继承前一页休息基类与派生类的对应关系单继承–派生类只从一个基类派生。多继承–派生类从多个基类派生。多重派生–由一个基类派生出多个不同的派生类。多层派生–派生类又作为基类,继续派生新的类。一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。通过继承,一个新建子类从已有的父类那里获得父类的特性。(遗传)从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生。类的继承是用已有的类来建立专用类的编程技术。派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整。一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对而言的。一个派生类只从一个基类派生,这称为单继承(singleinheritance),这种继承关系所形成的层次是一个树形结构。11.2派生类的声明方式class派生类名:继承方式基类名{派生类新增加的成员}假设已经声明了一个基类Student,在此基础上通过单继承建立一个派生类Student1:classStudent1:publicStudent//声明基类是Student{public:voiddisplay_1()//新增加的成员函数{cout″age:″ageendl;cout″address:″addrendl;}private:intage;//新增加的数据成员stringaddr;//新增加的数据成员};前一页休息继承方式三种继承方式–公有继承–私有继承–保护继承不同继承方式的影响主要体现在:1、派生类成员对基类成员的访问控制。2、派生类对象对基类成员的访问控制。继承方式是可选的,如果不写此项,则默认为private(私有的)。11.3派生类的构成实际上,并不是把基类的成员和派生类自己增加的成员简单地加在一起就成为派生类。构造一个派生类包括以下3部分工作:(1)从基类接收成员。派生类把基类全部的成员(不包括构造函数和析构函数)接收过来,也就是说是没有选择的,不能选择接收其中一部分成员,而舍弃另一部分成员。要求我们根据派生类的需要慎重选择基类,使冗余量最小。*(2)调整从基类接收的成员。接收基类成员是程序人员不能选择的,但是程序人员可以对这些成员作某些调整。*(3)在声明派生类时增加的成员。这部分内容是很重要的,它体现了派生类对基类功能的扩展。要根据需要仔细考虑应当增加哪些成员,精心设计。此外,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的。前一页休息11.4派生类成员的访问属性11.4.1公有继承(public)基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。通过派生类的对象只能访问基类的public成员。基类{公有成员保护成员私有成员}派生类{公有成员保护成员私有成员}公有继承派生类对象(类外定义)前一页休息例:公有继承举例#includeiostream.hclassPoint//基类Point类的声明{public://公有函数成员Point(floatx,floaty){X=x;Y=y;}voidMove(floatxOff,floatyOff){X+=xOff;Y+=yOff;}floatGetX(){returnX;}floatGetY(){returnY;}private://私有数据成员floatX,Y;};classRectangle:publicPoint//派生类声明{public://新增公有函数成员Rectangle(floatx,floaty,floatw,floath):Point(x,y){W=w;H=h;}//调用基类公有成员函数floatGetH(){returnH;}floatGetW(){returnW;}private://新增私有数据成员floatW,H;};intmain(){Rectanglerect(2,3,20,10);//创建派生类对象并初始化rect.Move(3,2);coutrect.GetX()','rect.GetY()','rect.GetH()','rect.GetW()endl;return0;}运行结果:5,5,10,20前一页休息派生类成员的访问属性11.4.2私有继承(private)基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。通过派生类的对象不能访问基类中的任何成员,基类原有的外部接口被派生类封装和隐蔽起来。基类{公有成员保护成员私有成员}派生类{公有成员保护成员私有成员}私有继承派生类对象(类外定义)图11.7对于不需要再往下继承的类的功能可以用私有继承方式把它隐蔽起来,这样,下一层的派生类无法访问它的任何成员。前一页休息例:私有继承举例classRectangle:privatePoint//派生类声明{public://新增外部接口Rectangle(floatx,floaty,floatw,floath):Point(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;};intmain(){//通过派生类对象只能访问本类成员Rectanglerect(2,3,20,10);rect.Move(3,2);coutrect.GetX()','rect.GetY()','rect.GetH()','rect.GetW()endl;return0;}前一页休息派生类成员的访问属性11.4.3保护继承(protected)基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可访问。*保护成员的意思是:不能被外界引用,但可以被派生类的成员引用。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能访问基类的private成员。通过派生类的对象不能访问基类中的任何成员基类{公有成员保护成员私有成员}派生类{公有成员保护成员私有成员}保护继承派生类对象(类外定义)例在派生类中引用保护成员。#includeiostream.hclassPoint//基类Point类的声明{public://公有函数成员Point(floatx=0,floaty=0){X=x;Y=y;}voidMove(floatxOff,floatyOff){X+=xOff;Y+=yOff;}floatGetX(){returnX;}floatGetY(){returnY;}protected://保护数据成员floatX,Y;};classRectangle:protectedPoint//派生类声明{public://新增外部接口Rectangle(floatx,floaty,floatw,floath){X=x;Y=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;};前一页休息在派生类中引用保护成员intmain(){//通过派生类对象只能访问本类成员Rectanglerect(2,3,20,10);rect.Move(3,2);coutrect.GetX()','rect.GetY()','rect.GetH()','rect.GetW()endl;return0;}前一页休息访问权限概括公有继承:基类的公有成员被继承为公有的;保护成员被继承为保护的;基类私有成员不可访问;派生类成员可直接访问它们;派生类对象可访问继承的公有成员;派生时用“public”作访问控制。私有继承:基类的公有成员和保护成员被继承为私有的;基类私有成员不可访问;派生类成员可直接访问它们;派生类对象不可访问它们;派生时用“private”作访问控制。保护继承:基类的公有成员和保护成员被继承为保护的;基类私有成员不可访问;派生类成员可直接访问它们;派生类对象不可访问它们;派生时用“protected”作访问控制。前一页休息继承方式public,private和protected是三种常用的继承方式,继承方式的不同决定了派生类对基类成员的访问权限不同。基类私有成员(private)公有成员(public)保护成员(protected)私有派生类(private)不可访问的成员私有成员私有成员公有派生类(public)不可访问的成员公有成员保护成员保护派生类(protected)不可访问的成员保护成员保护成员派生类的继承关系前一页休息[例11-(10)]分析下列程序中的访问权限,并回答所提的问题。#includeiostream.hclassA{public:voidf1();A(){i1=10;j1=11;}protected:intj1;private:inti1;};classB:publicA{public:voidf2();B(){i2=20;j2=21;}protected:intj2;private:inti2;};classC:publicB{public:voidf3();C(){i3=30;j3=31;}protected:intj3;private:inti3;};voidmain(){Aa;Bb;Cc;}(1)f2()能否访问f1(),i1,j1?能访问f1()、j1,不能访问i1(3)f3()能否访问f2()、i2和j2,以及f1(),j1和i1?f3能访问f2()和j2,以及f1()和j1,但不能访问i1和i2(4)c能否访问f2(),i2和j2?以及f1(),j1和i1?能访问f2()和f1(),其它的都不能访问(2)b能否访问f1(),i1,j1?能访问f1(),不能访问i1和j1例11.4多级派生的访问属性。classA//基类{public:inti;protected:voidf2();intj;private:intk;};classB:publicA//public方式{public:voidf3();protected:voidf4();pr
本文标题:c++11上海交大(针对谭浩强的书)
链接地址:https://www.777doc.com/doc-3391278 .html