第11章继承和派生
第11章 继承与派生讲义.
2018年11月10日星期 六12时46分5秒
湖北大学数计学院计科系 朱明
C++面向对象程序设计------第11章 继承与派生
18/115
2018年11月10日星期 六12时46分5秒
湖北大学数计学院计科系 朱明
C++面向对象程序设计------第11章 继承与派生
19/115
11.4.1 公有继承 Class Student//声明基类 {public: //基类公用成员 void get_value( ){cin>>num>>name>>sex;} void display( ) {cout<<″ num: ″<<num<<endl; cout<<″ name: ″<<name<<endl; cout<<″ sex: ″<<sex<<endl;} private : //基类私有成员 int num; string name; char sex; };
从基类接收成员 派生类把基类全部的成员(不包括构造函数和析构函 数)接收过来,也就是说是没有选择的,不能选择接 收其中一部分成员,而舍弃另一部分成员。需要慎 重选择基类,使冗余量最小。 调整从基类接收的成员 接收基类成员是程序人员不能选择的,但是程序人 员可以对这些成员作某些调整,如同名覆盖或重载。 在声明派生类时增加的成员 这部分内容是很重要的,它体现了派生类对基类功 能的扩展。要根据需要仔细考虑应当增加哪些成员, 精心设计。
湖北大学数计学院计科系 朱明
2018年11月10日星期 六12时46分4秒
(C++ 面向对象程序设计 谭浩强)第11章 继承与派生
第4篇面向对象的程序设计第11章继承与派生第12章多态性与虚函数第13章输入输出流第14章C++工具第11章继承与派生11.1继承与派生的概念11.2派生类的声明方式11.3派生类的构成11.4派生类成员的访问属性11.5派生类的构造函数和析构函数11.6多重继承11.7基类与派生类的转换11.8继承与组合11.9继承在软件开发中的重要意义面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。
要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特征——继承性和多态性。
在本章中主要介绍有关继承的知识,在第12章中将介绍多态性。
面向对象技术强调软件的可重用性(software reusability)。
C++语言提供了类的继承机制,解决了软件重用问题。
11.1继承与派生的概念在C++中可重用性是通过继承(inheritance)这一机制来实现的。
继承是C++的一个重要组成部分。
一个类中包含了若干数据成员和成员函数。
在不同的类中,数据成员和成员函数是不相同的。
但有时两个类的内容基本相同或有一部分相同。
利用原来声明的类Student作为基础,再加上新的内容即可,以减少重复的工作量。
C++提供的继承机制就是为了解决这个问题。
在第8章已举了马的例子来说明继承的概念。
见图11.1示意。
在C++中,所谓“继承”就是在一个已存在的类的基础上建立一个新的类。
已存在的类(例如“马”)称为“基类(base class )”或“父类(father class )”。
新建的类(例如“公马”)称为“派生类(derived class )”或“子类(son class )”。
见图11.2示意。
图11.1图11.2一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。
通过继承,一个新建子类从已有的父类那里获得父类的特性。
从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生。
类的继承是用已有的类来建立专用类的编程技术。
第章继承和派生ppt课件
#include "iostream.h"
class D: private B
{ int z;
public :
void Setz(int c) {z=c;}
void Setbase(int a, int b)
{x=a;
//对于派生类,仍是公有
y=b;
}
int Getbx() {return Getx();}
public
{ private : < 私有成员> ; public :
< 公有成员> ; protected : < 被保护成员> ;
}
, public
例: 11-4
class A
{protected :
//保护成员
int w;
public :
void Setw(int a) {w=a;}
int Getw(){return w;}
//私有派生时,
基类中的公有成员不能直接访问
d.Setz(3);
cout<<"x="<<d.Getbx()<<endl;
cout<<"y="<<d.Getby()<<endl;
cout<<"z="<<d.Getz()<<endl;
cout<<"sum="<<d.Sum()<<endl;
};
11.1.4 保护成员 对于派生类,它是公有的;对于外部程序,它是私
#include "iostream.h" void main()
第11章 c++继承与派生
在C++中,所谓“继承”就是在一个已存在的类的 基础上建立一个新的类。已存在的类(例如“马”) 称为“基类(base class)”或“父类(father class)”。 新建立的类(例如“公马”)称为“派生类(derived class)”或“子类(son class)”。见图11.2示意。
图11.1
由于基类的私有成员对派生类来说是不可访问的, 因此在派生类中的display_1函数中直接引用基类的 私有数据成员num,name和sex是不允许的。只能 通过基类的公用成员函数来引用基类的私有数据成 员。
可以将派生类Student1的声明改为
class Student1: public Student//以public方式声明派生类Student1 {public: void display_1( ) {cout<<″ age: ″<<age<<endl; //引用派生类的私有成员,正确 cout<<″ address: ″<<addr<<endl; //引用派生类的私有成员,正确 } private: int age; string addr; };
然后在main函数中分别调用基类的display函数和 派生类中的display_1函数,先后输出5个数据。 可以这样写main函数(假设对象stud中已有数据):
int main( ) {Student1 stud;//定义派生类Student1的对象stud
┆ stud.display( ); stud.display_1(); 的值 return 0; }
具体说,在讨论访问属性时,要考虑以下几种情况: (1) 基类的成员函数访问基类成员。 (2) 派生类的成员函数访问派生类自己增加的成员。 (3) 基类的成员函数访问派生类的成员。 (4) 派生类的成员函数访问基类的成员。 (5) 在派生类外访问派生类的成员。 (6) 在派生类外访问基类的成员。 对于第(1)和第(2)种情况,比较简单,按第8章介绍 过的规则处理,即: 基类的成员函数可以访问基类 成员,派生类的成员函数可以访问派生类成员。私 有数据成员只能被同一类中的成员函数访问,公用 成员可以被外界访问。
第11章 继承和派生
NewClass2
NewClass3
NewClass4
NewClass5
NewClass6
NewClass7
经验:继承层次一般不要超过3层
4 淮海工学院计算机工程学院 杨世通 2014-2015-1学期 2015年8月31日10时13分
C++程序设计 G计算机141
11.1 继承与派生的概念
继承的分类: 多父类继承:一个子类可以有几个父类
21
淮海工学院计算机工程学院 杨世通 2014-2015-1学期
2015年8月31日10时13分
C++程序设计 G计算机141
经
验
1、发现并封装变化 2、面向接口编程,而不是面向实现编程 3、优先使用组合,而不是优秀使用继承 (类爆炸)
22
淮海工学院计算机工程学院 杨世通 2014-2015-1学期
10
淮海工学院计算机工程学院 杨世通 2014-2015-1学期
2015年8月31日10时13分
C++程序设计 G计算机141
11.5 派生类的构造函数和析构函数
11.5.2含有子对象的派生类构造函数 (1)对基类数据成员初始化; (2)对子对象数据成员初始化; (3)对派生类自己简单数据成员初始化。
C++程序设计 G计算机141
第11章 继承和派生
11.1 继承与派生的概念 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 派生类的声明方式 派生类的构成 派生类成员的访问属性 派生类的构造函数和析构函数 多重继承 基类与派生类的转换 继承与组合 继承在软件开发中的重要意义
2015年8月31日10时13分
第11章继承和派生
电子与信息工程系
COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT
已存在的类(例如“马”)称为“基类(base class)” 或“父类(father class)”。新建立的类(例如“公 马”)称为“派生类(derived class)”或“子类(son class)”。见图11.2示意。
《C++程序设计 》网 络 教 学
电子与信息工程系
COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT
一个派生类不仅可以从一个基类派生,也可以从 多个基类派生。一个派生类有两个或多个基类的称 为多重继承(multiple inheritance)。
《C++程序设计 》网 络 教 学
图11.1
《C++程序设计 》网 络 教 学
图11.2
电子与信息工程系
COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT
一个派生类只从一个基类派生,这称为单继承 (single inheritance),这种继承关系所形成的层次 是一个树形结构,见下图。
箭头表示继承的方向,从派生类指向基类。
电子与信息工程系
COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT
面向对象程序设计有4个主要特点: 抽象 封装 继承 多态性
面向对象技术强调软件的可重用性(software reusability) 。C++语言提供了类的继承机制,解 决了软件重用问题。
《C++程序设计 》网 络 教 学
第11章 继承与派生《C++程序设计基础教程》课件
继承 调整 新增
8
11.2 派生类的构成
9
继承方式影响基类成员在派生类的访问属性
(1) 公用继承(public inheritance) 基类的公用和保护成员在派生类中保持原有访问 属性,私有成员仍为基类私有(不可访问)。
(2) 私有继承(private inheritance) 基类的公用和保护成员在派生类中成了私有成员, 私有成员仍为基类私有(不可访问) 。
(3) 受保护的继承(protected inheritance) 基类的公用和保护成员在派生类中成了保护成员, 私有成员仍为基类私有(不可访问) 。
9
11.2 派生类的构成
10
class A{ int x;
}; class B: A{ public:
void F(){ x = 1;
} };
基类的所有成员(构 造函数和析构函数除 外)都由派生类型继 承,甚至包括基类的 私有成员。但是,私 有成员的可访问域只 包括声明该成员的类 型的程序文本。
21
例11.5 析构函数的调用顺序举例22ຫໍສະໝຸດ class A{ int a;
public: A(int x):a(x) { //基类A的构造函数 cout << "construct A " << a << endl; } ~A() { //基类A的析构函数 cout << "destruct A " << a << endl; }
public:
void GetScore()
void Display()
private:
float score
第十一章继承和派生类-PPT精选文档
11.1 继承与派生的基本概念
保持已有类的特性而构造新类的过程称
为继承。定义新类时可以从一个或多个 既有类中继承(即拷贝)所有的数据成 员和函数成员,然后加上自己的新成员 或重新定义由继承得到的成员。 在已有类的基础上新增自己的特性而产 生新类的过程称为派生。 被继承的已有类称为基类(或பைடு நூலகம்类) 派生出的新类称为派生类。
Person
Employee
Customer
Vendor
Salaried
Hourly
Partner Client
PartTime
FullTime
使用继承机制和方法设计和建造类定义的层次结构 对于建立一个面向对象的软件系统是不可缺少的。
11.2 派生类的定义
定义派生类的一般格式:
class <派生类名> : <继承方式1> <基类名1>, <继承方式2> <基类名2>, …, <继承方式n> <基类名n> { <派生类新定义的成员> };
派生类的定义与构成
继承方式规定了派生类中对基类成员进
行访问控制的方式。 继承方式包括三种:public(公有继承)、 private (私有继承)和protected (保护 继承)。如果省略继承方式,缺省的类 的继承方式是private。 每一个继承方式,只对紧随其后的基类 进行限定。
继承与派生的例子
汽车
客车
货车
工程车
计程车
公共汽车
旅游车
继承与派生的基本概念
继承形成一个层次结构(继承关系是相对 的),一个类可由其它类通过继承得到, 继承得到的新类称派生类(子类),被继承的 称为基类(父类)。
(C++ 面向对象程序设计 谭浩强)第11章 继承与派生
在不同的类中,数据成员和成员函数是不相同的。
但有时两个类的内容基本相同或有一部分相同。
利用原来声明的类Student作为基础,再加上新的内容即可,以减少重复的工作量。
C++提供的继承机制就是为了解决这个问题。
在第8章已举了马的例子来说明继承的概念。
见图11.1示意。
在C++中,所谓“继承”就是在一个已存在的类的基础上建立一个新的类。 已存在的类(例如“马”)称为“基类(base class )”或“父类(father class )”。 新建的类(例如“公马”)称为“派生类(derived class )”或“子类(son class )”。
面向对象技术强调软件的可重用性(software reusability)。
C++语言提供了类的继承机制,解决了软件重用问题。
11.1 继承与派生的概念
在C++中可重用性是通过继承(inheritance)这一机制来实现的。
继承是C++的一个重要组成部分。
一个类中包含了若干数据成员和成员函数。
11.6 多重继承
11.7 基类与派生类的转换
11.8 继承与组合
11.9 继承在软件开发中的重要意义
面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。
要较好地进行面向对象程序设计,还必须了解面向对象程序设计另外两个重要特征——继承性和多态性。
在本章中主要介绍有关继承的知识,在第12章中将介绍多态性。
第4篇 面向对象的程序设计
第11章 继承与派生
第12章 多态性与虚函数
第13章 输入输出流
C++课件第十一章继承和派生类
基类和派生类之间的关系
基类是派生类的父类,派生类通过继承基类的属性和方法来实现代码的重用。基类和派生类之间是一种依赖关 系,派生类依赖于基类的存在。
派生类的构造函数和析构函数
C++课件第十一章继承和 派生类
继承是面向对象编程中一种重要的概念,它能够使得派生类从基类继承属性 和方法。本章将介绍继承的概念、派生类的定义和使用,以及派生类与基类 之间的关系。
继承的概念和作用
继承是一种重要的面向对象编程特性,它允许派生类继承基类的属性和方法, 从而实现代码的重用和扩展性。
派生类的定义和使用
成员变量
派生类可以继承基类的成员变量,并且可以添加 自己的新成员变量,从而实现更灵活的数据管理。
派生类的访问控制
派生类中的成员具有不同的访问权限,包括公有成员、保护成员和私有成员。通过合理设置访问权限,可以控 制派生类的接口和数据的访问范围。
多继承和虚继承
除了单继承外,C++还支持多继承和虚继承。多继承可以让派生类从多个基 类中继承属性和方法,而虚继承可以解决多继承中的二义性问题。
1
构造函数
派生类的构造函数用于初始化派生类对
析构函数
2
象,它会首先调用基类的构造函数,然 后执行派生类自身的初始化操作。
派生类的析构函数用于释放派生类对象
所占用的资源,它会首先执行派生类自
身的清理操作,然后调用基类的析构函
数。
派生类的成员函数和成员变且可以添加 自己的新成员函数,从而实现更丰富的功能。
谭浩强版C++程序设计 第11章 继承与派生2
11.1继承与派生的概念 继承与派生的概念
类的继承机制,解决了软件重用问题 类的继承机制 解决了软件重用问题. 解决了软件重用问题 例如: 例如
人类: 人类: 教师类: 教师类: 管理人员类: 管理人员类: 姓名,性别,年龄,身高,体重 姓名,性别,年龄,身高,体重,专业,职称 姓名,性别,年龄,身高,体重,专业, 专业 姓名,性别,年龄,身高,体重,职务 姓名,性别,年龄,身高,体重,职务
举例
class Student1:public Student class Student { pravite: { pravite: int age; int num; string addr; string name; public: char sex; void display1() public: { cout<<"age:"<<age<<endl; void display() cout<<"address:"<<addr {cout<<"num:"<<num; <<endl;} cout<<"name:"<<name; } cout<<"sex:"<<sex; } }
若将基类CLocation中的 中的x,y改成保护成员,即: 改成保护成员, 若将基类 中的 改成保护成员
11.3 派生类的构成
派生类的构成
派生类没有选择地把基类全部成员(不包括构 派生类没有选择地把基类全部成员 不包括构 造函数和析构函数)接收过来 接收过来.这容易造成数据 造函数和析构函数 接收过来 这容易造成数据 的冗余,需要设计者慎重选择基类 使冗余最小. 需要设计者慎重选择基类,使冗余最小 的冗余 需要设计者慎重选择基类 使冗余最小 设计者可以调整从基类接收的成员.如 指定继 设计者可以调整从基类接收的成员 如:指定继 承方式或在派生类中声明一个与基类同名的成 员取代基类成员. 员取代基类成员 在声明派生类时增加的成员. 在声明派生类时增加的成员 在声明派生类时,一般还应定义其构造函数和 在声明派生类时 一般还应定义其构造函数和 析构函数. 析构函数
C++课件第十一章继承和派生类
派生类的构造函数和析构函数
1
派生类的构造函数
可以调用基类的构造函数,也可以不调用。如果不调用,编译器会自动生成一个无参构造函 数。
2
派生类的析构函数
会自动调用基类的析构函数。如果基类的析构函数是虚函数,就可以实现多态。
3
在构造函数和析构函数中,基类和派生类的对象的构造和析构顺序
先构造基类对象,再构造派生类对象。析构的顺序与构造相反。
子类从基类继承了部分接口和实 现。可以重用基类的代码,减少 代码冗余。
继承和派生类的区别
继承
子类是对基类的扩展,没有独立的意义。
公有继承
基类中的公有成员和保护成员都被子类继承, 子类对象可以直接访问。
派生
子类在基类的基础上,添加新的数据成员或成 员函数,形成新的类。
私有继承
基类中的公有成员和保护成员都被子类继承, 但在子类中不能直接访问基类的成员。
C++课件第十一章继承和 派生类
掌握继承和派生类的基本概念和应用,对于理解和设计面向对象的程序设计 有重要意义。
类的层次结构
C++类可以形成层次结构
子类可以继承基类的数据成员和 成员函数。
类的继承关系就像家族关系
基类是父亲,派生类是儿子。一 个类可以有多个子类。
建立类的层次结构有助于 程序设计的模块化
虚函数和多态性
虚函数
在基类中定义一个虚函数,在派 生类中重新定义这个函数。
运行时多态性
一个指向派生类对象的基类指针 可以调用派生类的虚函数,实现 多态。增强了代码的灵活性。
静态多态性
编译期间就决定了调用哪个函数。 如函数重载等。
抽象类和纯虚函数
抽象类
继承和派生ppt课件
public
{ private : < 私有成员> ; public :
< 公有成员> ; protected : < 被保护成员> ;
}
, public
例: 11-4
class A
{protected :
//保护成员
int w;
public :
void Setw(int a) {w=a;}
int Getw(){return w;}
int Getby() {return Gety();}
int Getz() {return z;}
int Sum() {return(z+x+y);}
};
void main()
{ D d;
d.Setbase(1,2);
//对于外部程序,
它是私有的, 成员不能直接访问
d.Setz(3);
cout<<"x="<<d.Getbx()<<endl;
程序: class B { int x,y;
public : void Setx(int a) {x=a;} void Sety(int b) {y=b;} int Getx(){return x;} int Gety(){return y;}
};
class D: public B { int z; public: void Setz(int c) {z=c;} int Getz(){ return z;} int Sum() {return(Getx()+Gety()+Getz());} };
#include "iostream.h"
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
该用成,员必名须在 用派 基生 类类 名v{的受Aof(i:d作限:)f;h(用。() )域例内://不//BA直类类接中中可的的见ff ,如果要使
}
};
void main( )
{ B b;
b.f( );
// B 类中的 f
b.A::f( ); //A类中的f
}
即使派生类c{la中ss定Bin义:tp了zu; b与li基c A类同名但参数不同的成员
箭头表示继承的方向,从派生类指向基类。
一个派生类不仅可以从一个基类派生,也可以从 多个基类派生。一个派生类有两个或多个基类的称 为多重继承(multiple inheritance)。
关于基类和派生类的关系:派生类是基类的具体化, 而基类则是派生类的抽象。
11.2 派生类的声明方式
声明派生类的一般形式为: class 派生类名: [继承方式] 基类名 { 派生类新增加的成员 };
重写构造函数与析构函数
派生类对象结构
基类对象
对于下面的继承关系:
a b
子类对象
a b c
基类部分 子类添加部分
子类对象空间总是不小于基类 对象
class Father{ int a,b;
public: // 成员函数
}; class Son:public Father{
int c; public:
第4篇面向对象的程序设计
第11章 继承与派生 第12章 多态性与虚函数 第13章 输入输出流 第14章 C++工具
第11章 继承与派生
11.1 继承与派生的概念 11.2 派生类的声明方式 11.3 派生类的构成 11.4 派生类成员的访问属性 11.5 派生类的构造函数和析构函数 11.6 多重继承 11.7 基类与派生类的转换 11.8 继承与组合 11.9 继承在软件开发中的重要意义
已存在的类(例如“马”)称为“基类(base class)” 或“父类(father class)”。新建立的类(例如“公 马”)称为“派生类(derived class)”或“子类 (son class)”。见图11.2示意。
图11.1
图11.2
一个派生类只从一个基类派生,这称为单继承 (single inheritance),这种继承关系所形成的层次 是一个树形结构,见下图。
// 成员函数 };
11.4 派生类成员的访问属性
继承可以公有继承,保护继承和私有继承。 公有继承是普通继承,基类可以为大多数应用服 务。也可以重复继承。 保护继承是“单传”继承,只继承给自己的后代, 应用是以子孙的公有成员函数来对外展开服务的。 私有继承是“绝版”继承,该基类只继承直接的 子类,而不考虑让子类再继承下去。
构造一个派生类包括以下4部分工作:
吸收基类的成员
不论是数据成员,还是函数成员,除 构造函数与析构函数外全盘接收
改造基类成员
ቤተ መጻሕፍቲ ባይዱ
声明一个和某基类成员同名的新成员,派 生类中的新成员就屏蔽了基类同名成员称 为同名覆盖(override)
派生类新成员必须与基类成员不同名,它的
发展新成员 加入保证派生类在功能上有所发展。
继承方式包括: public(公用的),private(私有的) 和protected(受保护的),如果不写此项,则默认为 private(私有的)。
11.3 派生类的构成 派生类分为两大部分:
一部分是从基类继承来的成员 另一部分是在声明派生类时增加的部分 每一部分均分别包括数据成员和成员函数。
编制 派生 类时 可分 四步
{ B b; b.f( ); //A类中的 f b.g( ); //A类中的g b.h( ); //B类中的h
void h();
}
};
派生类的c{la定ss义Bi用n:t于pzu;描bli述c A派生类与基类的差别。派生 类中可以给pu出bl新ic:的成员,也可以对基类的成员进行重
定义。如果在派vv生ooii类dd fh中(());对基类的某个成员进行重定义, 则在派生类中对{该f(成);员//B的类访中问的是f 针对派生类中重定义
在公有派生类中的访问属性 不可访问 公有
保护
例:下面定义了两个具 有单继承关系的类A和 B,其中, A为基类,B为派生类:
class A {
int x,y; public:
void f(); void g(); }; class B : public A { int z; public: void h(); };
的成员。
g( ); //A类中的g }
};
void main( )
{ B b;
b.f( ); //B类中的 f
b.g ( ); //A类中的g
b.h( ); //B类中的h
}
派生类成员cla名ss的B作: p用ub域li嵌c A套在基类的作用域中,对
于基类的一个{pu成bl员ici:n,t 如z; 果派生类中没有定义与其同名 的成员,则该成员v名oid在f派( );生类的作用域内可见,否则,
在C++中对派生类有以下几点规定:
class A
派生类{ 除了拥有基类的所有成员(基类的构造函数
和赋值操作符in重t x载,y;函数除外)外,也可以具有新的成
员。
public: void f();
void g(); }; class B : public A {
int z; public:
void main()
面向对象程序设计有4个主要特点: 抽象 封装 继承 多态性
面向对象技术强调软件的可重用性(software reusability) 。C++语言提供了类的继承机制,解 决了软件重用问题。
11.1 继承与派生的概念
➢在C++中可重用性是通过继承(inheritance)这一 机制来实现的。继承是C++的一个重要组成部分。 ➢在C++中,所谓“继承”就是在一个已存在的类 的基础上建立一个新的类。 ➢见图11.1示意。
11.4.1 公有继承
public继承: 基类的public成员, 在派生类中成为public成员 基类的protected成员, 在派生类中成为protected 成员 基类的private成员, 在派生类中成为不可直接使用的成员
表11.1公用基类在派生类中的访问属性
公有基类的成员
私有成员 公有成员 保护成员
函数,基类的pu同bl名ic:函数在派生类中的作用域中也是不