清华大学:c 7继承与派生
继承与派生
4.1 继承和派生的概念
在软件开发过程中,在定义特殊类时,不需把它的一 般类已经定义过的属性和服务重复地书写一遍,只需要声 明它是某个类的特殊类,并定义它自己的特殊属性和服务。 这将明显地减轻开发工作的强度。 4.1.2 继承的作用 面向对象程序设计的继承性使得大型应用程序的维护 和设计变得更加简单。一方面,大型应用程序设计完成并 交付使用后,经常面临用户的需求发生变化,程序功能需 要扩充等问题。这时程序的修改需要非常谨慎,因为某个 局部的修改可能会影响其他部分,而一个正在使用中的系 统要进行全面的测试,既费时间又有很多实际的困难。另 一方面,一个新的应用系统程序设计在许多方面会和以前 设计过的某个或某些系统的模块非常类似,怎样加快大型 应用程序的开发速度,重用这些已经开发成功的程序模块, 一直是软件设计中迫切需要解决的问题。
4.2 派生类
C++语言派生类多重继承的定义格式如下: class <派生类名>:[继承方式1] [<基类名1>],[继承 方式2] [<基类名2>],…, [继承方式n] [<基类名n>] { <派生类成员变量和成员函数定义> }; 通常,在多重继承时,继承方式设计成一致的形式。 如继承方式均设计成public,或均设计成private。
cc07继承与派生
8
3 种继承方式
类 成 员
的
▪ 不同继承方式的影响主要体现在:
▪ 派生类成员函数对基类成员的访问控制。 ▪ 外部代码对基类成员的访问控制。
访
问
控 制
从基类继承 过来的成员
公有 私有 保护 成员 成员 成员
外 部 代 码
访问控制
新增成员代码
9
公有继承(public)
类 ▪公有派生——
成 ▪原基类中的
2
继承与派生问题举例
类
的
交通工具
继
承
汽车
与
派
小汽车
卡车
旅行车
生
工具车
轿车
面包车
3
继承与派生问题举例
类 的
动物
继
承
与
猿
猫科
鸟
派
生
狮
虎
猎豹
4
继承与派生问题举例
类
的 继
几何形状
承
与
派
生
圆
矩形
5
继承与派生问题举例
类 的 继
承 与 派 兼职技术人员
生
雇员
管理人员
销售人员
销售经理
6
继承与派生的目的
类
的 ▪ 继承的目的——实现代码重用。
rect.InitR(2,3,20,10);
rect.Move(3,2);
cout<<rect.GetX()<<','
<<rect.GetY()<<','
<<rect.GetH()<<','
继承与派生实验报告
继承与派生实验报告继承与派生实验报告引言:继承与派生是面向对象编程中的重要概念,通过继承,一个类可以派生出子类,从而实现代码的复用和扩展。
本文将通过实验来探讨继承与派生的概念、原理和应用。
实验目的:1. 理解继承与派生的概念和原理;2. 掌握如何在编程语言中实现继承和派生;3. 熟悉继承与派生的应用场景。
实验步骤:1. 创建父类:首先,我们创建一个名为"Animal"的父类,该类具有属性和方法,例如"age"和"eat()"。
2. 创建子类:接下来,我们创建一个名为"Cat"的子类,该类继承自"Animal"类。
在子类中,我们可以重写父类的方法或添加新的方法。
3. 实例化对象:通过实例化父类和子类的对象,我们可以调用它们的方法和访问它们的属性。
4. 测试继承与派生:我们可以通过调用父类和子类的方法,观察它们的行为是否符合预期。
实验结果:在创建父类"Animal"时,我们定义了一个"age"属性和一个"eat()"方法。
在创建子类"Cat"时,我们继承了父类的属性和方法,并添加了一个新的"meow()"方法。
在实例化父类对象时,我们可以通过调用"eat()"方法来模拟动物进食的行为。
而在实例化子类对象时,我们既可以调用从父类继承而来的"eat()"方法,也可以调用子类特有的"meow()"方法来模拟猫咪的叫声。
通过实验,我们发现继承与派生的优势在于代码的复用和扩展。
我们只需在父类中定义一次通用的属性和方法,然后让不同的子类继承父类,即可实现代码的复用。
同时,子类还可以通过重写父类的方法或添加新的方法,实现代码的扩展和个性化。
讨论与应用:继承与派生不仅仅局限于上述的父类和子类关系,它还可以在多层次的继承结构中发挥作用。
计算机等级考试二级C++考点分析之继承和派生
7.1 继承和派⽣考点1 继承和派⽣的基本概念 继承的实质就是建造新的派⽣类。
派⽣类从⼀个或多个以前定义的基类继承数据和函数,同时增加或重新定义数据和操作。
这就产⽣了类的层次性。
换句话说,继承就是创建⼀个具有别的类属性和⾏为的新类的能⼒。
我们把这种通过特殊化已有的类来建⽴新类的过程,叫做“类的派⽣”,原有的类叫做“基类”,新建⽴的类叫做“派⽣类”从类的成员⾓度来看,派⽣类⾃动地将基类的所有数据成员和除了构造,析构函数之外的全部成员函数作为⾃⼰的成员,这叫做“继承”。
基类和派⽣类⼜可以分别叫做“⽗类”和“⼦类”。
在C++中有两种继承:单继承和多继承。
对于单继承,派⽣类中只能有⼀个基类;对于多继承,派⽣类可以有多个基类。
单继承和多继承的基类和派⽣类的关考点2 派⽣类的定义与构成 在C++中,定义派⽣类的⼀般形式为: 单继承的定义如下: class<派⽣类名>:<继承⽅式><基类名>{<派⽣类新定义的成员>}; 多继承的定义如下: class<派⽣类名>:<继承⽅式1><基类名1>,<继承⽅式2><基类名2>, …<继承⽅式n><基类名n>{<派⽣类新定义的成员>}; 其中,<继承⽅式>即派⽣类的访问控制⽅式,⽤于规定基类成员在派⽣类中的访问权限,即基类成员在派⽣类中是公有的、私有的或保护的。
常⽤的3种继承⽅式是公有继承(public),私有继承(private)和保护继承(protected)。
缺省的类继承⽅式是私有继承private . <派⽣类新定义的成员>是指定义的派⽣类⾃⼰的成员(除了从基类继承来的所有成员之外,新增加的数据成员和函数成员)。
派⽣类的成员由两部分构成:⼀部分是从基类继承得到的,⼀部分是⾃⼰定义的新成员,所有这些成员仍然分为公有(public),私有(private)和保护(protected)3种访问性质。
C语言程序设计(郑莉)课后习题答案
C++语言程序设计(清华大学郑莉)课后习题答案第一章概述1-1 简述计算机程序设计语言的发展历程。
解:迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。
1-2 面向对象的编程语言有哪些特点?解:面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。
面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。
通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。
因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。
C++语言是目前应用最广的面向对象的编程语言。
1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点?解:结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。
结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。
当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。
由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。
C语言课件 清华大学谭浩强版c7
被包含文件内容
源文件(*.c) 头文件(*.h)
宏定义 数据结构定义 函数说明等
file3.c file2.c file1.c A
文件包含可嵌套
#include "file2.c" A
#include "file3.c" C B file3.c
file1.c
file2.c
例 文件包含举例
/* powers.h */ #define sqr(x) ((x)*(x)) #define cube(x) ((x)*(x)*(x)) #define quad(x) ((x)*(x)*(x)*(x))
/*ch8_10.c*/ #include <stdio.h> #include "d:\fengyi\bkc\powers.h" #define MAX_POWER 10 void main() { int n; printf("number\t exp2\t exp3\t exp4\n"); printf("----\t----\t-----\t------\n"); for(n=1;n<=MAX_POWER;n++) printf("%2d\t %3d\t %4d\t %5d\n",n,sqr(n),cube(n),quad(n)); }
{…….. printf("2*PI=%f\n",PI*2); else if (x==0) printf("error!\n"); 例 #define MAX MAX+10 (×) 宏定义中使用必要的括号() } 宏展开:printf("2*PI=%f\n",3.14159*2);
C++语言程序设计实验答案_继承与派生
实验07 继承与派生(4学时)(第7章继承与派生)一、实验目的二、实验任务7_1 声明一个基类Animal。
有私有整型成员变量age,构造其派生类dog,在其成员函数SetAge(int n)中直接给age 赋值,看看会有什么问题,把age改为公有成员变量,还会有问题吗?编程试试看.7_2 声明一个基类BaseClass。
有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。
7_3 声明一个车(vehicle)基类。
具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。
自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。
从bicycle和motorcar派生出摩托车(motorcycle)类,在继承过程中,注意把vehicle设置为虚基类.如果不把vehicle设置为虚基类,会有什么问题?编程试试看。
7_4 以实验6中的People(人员)类为基类.派生出student(学生)类,添加属性:班号char classNo[7];派生出teacher(教师)类,添加属性:职务char principalship[11]、部门char department[21]。
从student类中派生出graduate(研究生)类,添加属性:专业char subject[21]、导师teacher adviser;从graduate类和teacher类派生出TA(助教生)类,注意虚基类的使用。
重载相应的成员函数,测试这些类。
类之间的关系如图7-1所示。
图7-1 类图三、实验步骤1.(编程)声明基类Animal,成员变量age声明为私有的。
构造派生类dog,在其成员函数SetAge(int n)中直接对age赋值时,会出现类似以下的错误提示:(注:在桌面创建一个文本文件,将输出框的内容复制到文本文件中,再复制到Word文件中,不会出现汉字的乱码)把age改为公有变量后重新编译就可以了.程序名:lab7_1。
c课程设计继承与派生
c 课程设计继承与派生一、教学目标本章节的教学目标是让学生掌握C语言中继承与派生的概念,理解并能够运用继承与派生编写C++程序。
具体目标如下:1.知识目标:理解继承与派生的概念及其在C++程序设计中的应用。
掌握继承与派生的基本语法和用法。
2.技能目标:能够运用继承与派生编写C++程序,解决实际问题。
能够分析并修改现有程序中的继承与派生相关问题。
3.情感态度价值观目标:培养学生的编程思维,提高学生对C++程序设计的兴趣。
培养学生的团队协作能力,鼓励学生在课堂上积极互动、交流。
二、教学内容本章节的教学内容主要包括以下部分:1.继承与派生的概念及其作用。
2.继承与派生的基本语法和用法。
3.继承与派生在实际编程中的应用案例。
具体的教学大纲如下:1.第一课时:介绍继承与派生的概念及其作用。
2.第二课时:讲解继承与派生的基本语法和用法。
3.第三课时:通过案例分析,让学生掌握继承与派生在实际编程中的应用。
三、教学方法为了提高教学效果,本章节将采用以下教学方法:1.讲授法:讲解继承与派生的概念、语法和用法。
2.案例分析法:分析实际编程中继承与派生的应用,让学生更好地理解知识点。
3.实验法:让学生动手编写代码,巩固所学知识,提高实际编程能力。
四、教学资源为了支持本章节的教学,我们将准备以下教学资源:1.教材:《C++程序设计》等相关教材。
2.参考书:提供一些关于继承与派生的相关论文和书籍,供学生自主学习。
3.多媒体资料:制作PPT、视频等多媒体资料,帮助学生更好地理解知识点。
4.实验设备:提供计算机实验室,让学生能够动手编写代码,进行实验。
五、教学评估为了全面、客观地评估学生在学习C课程中继承与派生章节的学习成果,我们将采取以下评估方式:1.平时表现:通过课堂参与、提问、讨论等方式评估学生的学习态度和理解程度。
2.作业:布置与继承与派生相关的编程作业,评估学生对知识点的掌握和运用能力。
3.考试:安排一次期中考试,测试学生对继承与派生知识点的理解和运用能力。
c++7继承与派生
1. 可以访问 f1( )和j1, 而不可以访问 i1 2. 可以访问 f1( ),而不可以访问 i1和 j1 3. 可以访问直接基类中的 f2( )和 j2以及间接基类中 的 f1( )和 j1,而不可以访问 i2和 i1 4. 可以访问直接基类中的 f2( )和间接基类中的 f1( ), 其它均不可以
A
B C
输入设备
键盘 鼠标 扫描仪
B. 派生类是基类定义的延续(虚函数) C. 派生类是基类的组合(多继承)
四、 单继承中成员访问权限
class A { public: void f1( ); protected:int j1; private: int i1; }; class C:public B { public: void f3( ); }; class B:public A { public: void f2( ); protected: int j2; private: int i2; };
void main() { A oba; cout<<oba.max<<endl; //合法吗?5 cout<<oba.min<<endl; //合法吗?6
B obb; cout<<obb.max<<endl; //合法吗?7 cout<<obb.min<<endl; //合法吗?8
}
//1、3、4合法;其余不合法
换句话说:
保持已有类的特性而构造新类的过程称为继承。 在已有类的基础上新增自己的特性而产生新类的 过程称为派生。
继承的思想方法是人类常用的分析问题的方 法——演绎
动物
猴子
猫
鸟
狮子
C++中的继承和派生详解
如图7.1所示,C++中有两种继承:单一继承和多重继承。 对于单一继承,派生类只能有一个基类;对于多重继承, 派生类可以有多个基类。
图7.1 类的单一继承和多重继承的UML结构图
在图7.1中,箭头指向基类。单一继承形成一个倒挂的 树。派生类继承了基类所有的数据成员和成员函数,程 序员也可以在派生类中添加新的数据成员和成员函数。 这样,基类定义了对象的一个集合,派生类通过增添新 的成员限制基类的定义,以便定义基类对象集合的一个 子集。 由此可见,从编码角度讲,派生类从基类中以较低代价 换来了大量的灵活性。一旦产生了可靠的基类,只需要 调试派生类中所做的修改即可。 C++派生类从父类中继承性质时,可使派生类扩展它们, 或者对其做些限制,也可改变或删除,甚至不作任何修 改。所有这些变化可归结为两类基本的面向对象技术。 第一种称为性质约束,即对基类的性质加以限制或删除。 第二种称为性质扩展,即增加派生类的性质。
冒号后“基类名(参数表)”称为成员初始化列表,参数 表给出所调用的基类构造函数所需要的实参。实参的值可 以来自“参数表0”,或由表达式给出。可以像Rectangle 那样,在类中直接定义为内联函数。下面是在类说明之外 定义的示范: Rectangle::Rectangle(int a, int b, int h, int w):Point(a,b) {H=h; W=w; cout<<"Rectangle..."<<endl;} “参数表0”有4个参数,基类Point的参数表是自己的2 个数据成员。 构造函数(包括析构函数)是不被继承的,所以一个派生 类只能调用它的直接基类的构造函数。当定义派生类的一 个对象时,首先调用基类的构造函数,对基类成员进行初 始化,然后执行派生类的构造函数,如果某个基类仍是一 个派生类,则这个过程递归进行。当该对象消失时,析构 函数的执行顺序和执行构造函数时的顺序正好相反。输出 结果也证实了这个结论。
程序设计-继承与派生(三 四
第七章 继承与派生(三 四)
清华大学
2
目录
7.1 类的继承与派生 7.2 访问控制 7.3 类型兼容规则 7.4 派生类的构造、析构函数 7.5 派生类成员的标识与访问 7.6 程序实例——用高斯消去法解线性方程组 7.7 综合实例——个人银行账户管理程序 7.8 深度探索 7.9 小结
C++语言程序设计(第4版),清华大学
7.5 派生类成员的标识与访问 —— 7.5.1 作用域分辨
19
同名隐藏规则
当派生类与基类中有相同成员时:
• 若未强行指名,则通过派生类对象使用的是派生 类中的同名成员。
• 如要通过派生类对象访问基类中被隐藏的同名成 员,应使用基类名限定。
C++语言程序设计(第4版),清华大学
int main() { C obj(5, 6); obj.print(); return 0;
}
C++语言程序设计(第4版),清华大学
7.4 派生类的构造和析构函数 —— 7.4.1 构造函数
8
多继承时的构造函数
派生类名::派生类名(参数表):基类名1(基类1初始化 参数表), 基类名2(基类2初始化参数表), ...基类名 n(基类n初始化参数表)
Base2(int j) { cout << "Constructing Base2 " << j << endl; } ~Base2() { cout << "Destructing Base2" << endl; } };
class Base3 { //基类Base3,构造函数无参数 public:
C++类的继承和派生
单击此处添加副标题
演讲人姓名
单击此处添加正文,文字是您思想的提炼,为了演示发布的良好效果,请言简意赅地阐述您的观点。
1
面向对象程序设计有4个主要特点: 抽象、封装、继承和多态性。在本章中主要介绍有关继承的知识,在下一章中将介绍多态性。 C++语言提供了类的继承机制,解决了软件重用问题。
如果在派生类中定义了和基类中同名函数(函数参数个数和类型可以相同也可以不相同),则派生类中的函数会隐藏基类的同名函数。在派生类中不能直接访问基类中的同名函数。(注意与重载的区别。在同一个类中的同名不同参函数为重载函数)
如程序PointRect1所示:
1
2
4.4继承方式
派生类的继承方式有三种:public,private,protected。不同的继承方式决定了基类成员在派生类中的访问属性。
void main(式
4.4.1 简单的派生类的构造函数
#include <iostream> #include<string> using namespace std; class Student { public: Student(int n,string nam,char s) {num=n; name=nam; sex=s; } ~Student( ){ } protected: int num; string name; char sex ; };
//Rectangle.h #include <iostream> #include "Point.h" using namespace std; class Rectangle:public Point { private: int width; int height; public: int GetWidth() { return width; } int GetHight() { return height; }
C++语言程序设计教程(第二版)清华出版 杨进才第8章 继承与派生ppt课件
第 (2)继承关系不允许循环
8
在派生过程中,不允许类A派生出类B,类B又派生出类C,而类C又派生出类A。
章
继 承 与 派 生
C +
8.1.3 继承与组合
+
语
继承描述的是一般类与特殊类的关系,类与类之间体现的是“is a kind of”,
8
~Clock();
::
::
SetTime()
ShowTime()
章 };
继
class AlarmClock: public Clock {
承 private:
AH, AM, OpenAlarm SetAlarm()
与
int AH,AM; //响铃的时间
派
bool OpenAlarm; //是否关闭闹钟
计 (Derived class)或子类(Sub class)。派生类拥有基类的特性称作继承,由基类产
教 生派生类的过程称为派生。
程
每一个派生类都有且仅有一个基类,派生类可以看作是基类的特例,它增加
了某些基类所没有的性质。这种继承方式,称为单继承或单向继承。
第
现实生活中,子女的外貌、血型往往不是仅仅继承自父亲或母亲,而是将父
设 可以作为基类再继续派生新的派生类。这样,就形成了一个相互关联的类的家族
计 ,有时也称作类族。在类族中,直接派生出某类的基类称为直接基类,基类的基
教 类甚至更高层的基类称为间接基类,比如类A派生出类B,类B又派生出类C,则类 程 B是类C的直接基类,类A是类B的直接基类,而类A称为类C的间接基类。
成员,这样派生类中的新成员就“覆盖”了基类的同名成员。由此可见,派生类中
继 承 与
c++学习课件7(清华大学第五版)
void main( )
{ graduatestudent zh; //生成派生类对象
//zh.Getage( );// 即:student::Getage( ); 不能访问
zh.Getnum( ); //访问派生类中的公开成员
//cout<<zh.sex; //即:student::sex,error 私有成员
可编辑ppt
19
公有继承
void graduatestudent::Getnum( ) //派生类成员函数定义
{ //cout<<"age:"<<age<<endl; //不可访问基类的私有成员
cout<<"stunum:"<<stunum<<endl; //派生类的私有成员
cout<<"age:"<<Getage( )<<endl; //基类的公有成员 cout<<"sex:"<<sex<<endl; 即:student::Getage( )
//cout<<zh.stunum; //error 私有成员
//cout<<zh.age;
//即:student::age,error
}
可编辑ppt
27
3. 保护继承
●当类的继承方式为protected继承属性时,在派生 类中,基类的公有成员和保护成员均作为派生类的保 护成员,派生类的成员可以直接访问它们,而派生类 的成员无法访问基类的私有成员。
7.4 派生类的构造函数和析构函数
●基类的构造函数的功能是创建基类对象并进 行初始化,而析构函数的功能在基类对象生存 期结束时对基类对象进行必要的清理工作。
C++语言程序设计第7章 继承与派生
• 派生出的新类称为派生类(Derived Class)
– 子类(Child Class),Smalltalk语言称为子类 (Sub Class)
继承与派生问题举例
人
工人
农民
商人
知识分子
军人
教师
医生
军医
void setY(float Y); float getY();
公有 公有
公有 公有 公有 公有
继承
void moveTo(Point newPoint);
Point(void); Point(const Point &); ~Point(void); Point& operator=(Point&);
来源
Circle的成员
原访 新访问权限 问 权 限
私有 不可直接访问 私有 不可直接访问 公有 公有 公有 公有
备注
继承 继承 继承 继承
float x; float y; void initPoint(float X, float Y); void setX(float X);
继承
继承 继承
float getX();
• 声明语法 : class 派生类名:继承方式 基类名 { private: 私有成员说明列表 protected: 保护成员说明列表 public: 公有成员说明列表 };
• 【例7.1】派生类示例 – 从Point类派生出Circle类
class Point { private: float x,y; public: void initPoint(float X, float Y) {x=X;y=Y;}//模仿构造函 数 //访问方法 void setX(float X) {x=X;} float getX() {return x;} void setY(float Y) {y=Y;} float getY() {return y;} void moveTo(Point newPoint) //业务方法 { x=newPoint.x;y=newPoint.y; } };
c继承与派生
• 不可访问成员
– 在类外不能被直接访问。 – 在派生类的类内不能被直接访问。
2019/1/25 11
举例:公有派生
class Base{ class Derived : public Base{ int v1; int v3; public: public: int v2; int v4; Base(int a=0,int b=0){ Derived(int a=0,int b=0){ v1=a;v2=b; v3=a;v4=b; } } }; void func(){ void main( ){ int sum1=v1+v2+v3+v4; //错误 Derived obj(5,6); int sum2=v2+v3+v4; obj.v2=8; } }; }
• 构造函数的调用顺序如下:
– 先调用基类构造函数; – 再调用对象成员所属类的构造函数; – 最后调用派生类构造函数;
• 析构函数的调用顺序如下:
– 先调用派生类的析构函数; – 再调用对象成员所属类的析构函数;
2019/1/25
– 最后调用基类的析构函数;
26
举例
class Base{ public: Base() { cout<<“Base created\n”;} }; class Derived:public Base{ public: Derived(){ cout<<“Derived created\n”; } }; void main(){ Derived d; } 2019/1/25
•
此时基类的数据成员x的值为多少?
2019/1/25 28
赋值兼容规则
• 在公有派生方式下,派生类对象可以作为 基类对象来使用,具体方式如下:
C继承和派生
C继承和派生简单来说:有两个类A和B,A是父类,B是子类。
那么就可以说:A派生出B,B继承与A。
例:父亲“派生” 出儿子儿子“继承” 自父亲派生和继承,本质是相同的,只是从不同角度来描述他们而已。
继承和派生在UML中的表示:注意是空心三角形从子类【派生的类】指向父类【被继承的类】父类,也被称为”基类”除了”构造函数“ 和”析构函数“,父类的所有成员函数,以及数据成员,都会被子类继承!假如已经定义好了父类Father,里面定义好私有数据成员name 和age,和公有的构造函数、成员方法description等。
当子类Son 要继承父类Father时,需要包含”父类的头文件“,定义方式如下:公有继承方式#include "Father.h" // 包含父类的头文件class Son : public Father {// 详细见下面全部代码}假如子类Son要调用自定义的重载构造函数是:1.会先调用父类的构造函数,用来初始化父类继承的数据,2.再掉用自己的构造函数,用来初始化自己定义的数据。
例:Son::Son(const char *name, int age, const char *game) : Father(name, age) {// 没有体现父类的构造函数, 那就会自动调用父类的默认构造函数this->game = game; // 子类自己定义的数据成员}注意一:子类的成员函数,不能访问从父类继承的private成员例:在子类Son中,this->name = name;或者cout << age << endl;都是错误的。
但子类可以访问父类的成员函数,如cout << getName() << getAge() << endl;都是正确的。
注意二:子类对象调用方法时,现在自己定义的方法中去寻找,如果有,就调用自己定义的方法;如果找不到,就到父类的方法中去找,如果有,就调用父类的这个同名方法;如果在父类中找不到,就发生错误!例:父类和子类都定义了description方法,子类Son去调用这个方法,会优先在自己的方法里去找来调用,如果没有,再去父类里找;也没有的话就报错。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8
C++语言程序设计
清华大学 郑莉
派生类的声明
类 的 继 承 与 派 生
class 派生类名:继承方式 基类名 { 成员声明; }
9
C++语言程序设计
清华大学 郑莉
பைடு நூலகம்
继承方式
类 成 员 的 访 问 控 制
不同继承方式的影响主要体现在:
– 派生类成员对基类成员的访问权限 – 通过派生类对象对基类成员的访问权限
14
C++语言程序设计
清华大学 郑莉
私有继承(private)
类 成 员 的 访 问 控 制
基类的public和protected成员都以 private身份出现在派生类中,但基类 的private成员不可直接访问。 派生类中的成员函数可以直接访问基 类中的public和protected成员,但 不能直接访问基类的private成员。 通过派生类的对象不能直接访问基类 中的任何成员。
类 的 继 承 与 派 生
几 何形状
圆
矩 形
6
C++语言程序设计
清华大学 郑莉
继承与派生问题举例
类 的 继 承 与 派 生
雇员
兼职技术人员
管理人员
销售人员
销售经理
7
C++语言程序设计
清华大学 郑莉
继承与派生的目的
类 的 继 承 与 派 生
继承的目的:实现代码重用。 派生的目的:当新的问题出现,原有 程序无法解决(或不能完全解决)时, 需要对原有程序进行改造。
三种继承方式
– 公有继承 – 私有继承 – 保护继承
10
C++语言程序设计
清华大学 郑莉
公有继承(public)
类 成 员 的 访 问 控 制
基类的public和protected成员的访问 属性在派生类中保持不变,但基类的 private成员不可直接访问。 派生类中的成员函数可以直接访问基类 中的public和protected成员,但不能 直接访问基类的private成员。 通过派生类的对象只能访问基类的 public成员。
28
void A::setA(int x) { a=x; } void B::setB(int x) { b=x; }
void C::setC(int x, int y, int z) { //派生类成员直接访问基类的
//公有成员
setA(x); setB(y); c=z; } //其它函数实现略
23
class B1: public B0 { public: void display(){cout<<"B1::display()"<<endl;} }; class D1: public B1 { public: void display(){cout<<"D1::display()"<<endl;} }; void fun(B0 *ptr) { ptr->display();//"对象指针->成员名" }
17
C++语言程序设计
清华大学 郑莉
保护继承(protected)
类 成 员 的 访 问 控 制
基类的public和protected成员都以 protected身份出现在派生类中,但 基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基 类中的public和protected成员,但 不能直接访问基类的private成员。 通过派生类的对象不能直接访问基类 中的任何成员
15
C++语言程序设计
清华大学 郑莉
例7-2 私有继承举例
类 成 员 的 访 问 控 制
class Rectangle: private Point //派生类声明 {public: //新增外部接口 void InitR(float x, float y, float w, float h) {InitP(x,y);W=w;H=h;} //访问基类公有成员 void Move(float xOff, float yOff) {Point::Move(xOff,yOff);} float GetX() {return Point::GetX();} float GetY() {return Point::GetY();} float GetH() {return H;} float GetW() {return W;} private: //新增私有数据 float W,H; };
16
#include<iostream> #include<cmath> using namecpace std; int main() { //通过派生类对象只能访问本类成员 Rectangle rect; rect.InitR(2,3,20,10); rect.Move(3,2); cout<<rect.GetX()<<',' <<rect.GetY()<<',' <<rect.GetH()<<','<<rect.GetW()<<endl; return 0; }
单一继承时的构造函数
派生类名::派生类名(基类所需的形参, 本类成员所需的形参):基类名(参数表)
{
本类成员初始化赋值语句; };
31
C++语言程序设计
清华大学 郑莉
派 生 类 的 构 造 、 析 构 函 数
单一继承时的构造函数举例
#include<iostream> using namecpace std; class B{ public: B(); B(int i); ~B(); void Print() const; private: int b; };
清华大学 郑莉
例7-3 protected 成员举例
类 成 员 的 访 问 控 制
class A { protected: int x; } int main() { A a; a.x=5; //错误 }
20
class A { protected: int x; } class B: public A{ public: void Function(); }; void B:Function() { x=5; //正确 }
22
C++语言程序设计
清华大学 郑莉
例7-4 类型兼容规则举例
类 型 兼 容
#include <iostream> using namecpace std; class B0 //基类B0声明 { public: void display(){cout<<"B0::display()"<<endl;} //公有成员函数 };
12
class Rectangle: public Point //派生类声明 {
public:
//新增公有函数成员
void InitR(float x, float y, float w, float h) {InitP(x,y);W=w;H=h;}//调用基类公有成员函数 float GetH() {return H;} float GetW() {return W;}
继承时的构造函数
基类的构造函数不被继承,派生类中 需要声明自己的构造函数。 声明构造函数时,只需要对本类中新 增成员进行初始化,对继承来的基类 成员的初始化,自动调用基类构造函 数完成。 派生类的构造函数需要给基类的构造 函数传递参数
30
C++语言程序设计
清华大学 郑莉
派 生 类 的 构 造 、 析 构 函 数
C++语言程序设计
第七章 继承与派生
清华大学 郑 莉
1
C++语言程序设计
清华大学 郑莉
本章主要内容
类的继承与派生 类成员的访问控制 单继承与多继承 派生类的构造、析构函数 类成员的标识与访问
2
C++语言程序设计
清华大学 郑莉
类的继承与派生
保持已有类的特性而构造新类的过程 称为继承。 在已有类的基础上新增自己的特性而 产生新类的过程称为派生。 被继承的已有类称为基类(或父类)。 派生出的新类称为派生类。
B0::display() B0::display()
25
C++语言程序设计
清华大学 郑莉
基类与派生类的对应关系
单 继 承 与 多 继 承
单继承
– 派生类只从一个基类派生。
多继承
– 派生类从多个基类派生。
多重派生
– 由一个基类派生出多个不同的派生类。
多层派生
– 派生类又作为基类,继续派生新的类。
class A{ public: void setA(int); void showA(); private: int a; }; class B{ public: void setB(int); void showB(); private: int b; }; class C : public A, private B{ public: void setC(int, int, int); void showC(); private: int c; };
private:
};
//新增私有数据成员
float W,H;