第11章 继承和派生类

合集下载

第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章 继承与派生

(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一个新类从已有的类那里获得其已有特性,这种现象称为类的继承。

通过继承,一个新建子类从已有的父类那里获得父类的特性。

从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生。

类的继承是用已有的类来建立专用类的编程技术。

C 课件 第十一章 继承和派生类

C  课件 第十一章 继承和派生类
#include <string.h> class employee{ private: char *name; short age; float salary; public: employee( ) { name=0; age=0; salary=0.0; } employee(char *name1, short age1, float salary1) { name=new char[strlen(name1)+1]; strcpy(name,name1); age=age1; salary=salary1; }
私有派生 A private:aa1 protected:aa2 public:aa3 Class B: A { private:bb1 protected:bb2 public:bb3 }
B private:bb1 aa2 aa3 protected: bb2 public: bb3
2 派生类的使用
void print( ) const //const成员函数:不能改变类中成 成员函数: 成员函数 员数据的值, 员数据的值,也不能调用类中非 const成员函数 成员函数 { cout<<“name:”<<name; cout<<“age:”<<age; cout<<“salary:”<<salary<<endl; } ~employee( ) { delete [ ]name; } }; Manager: 除具有employee的属性外,有新的属性。为避免重复定义, 除具有 的属性外,有新的属性。为避免重复定义, 的属性外 可从employee中派生出 中派生出manager(派生类)。 可从 中派生出 (派生类)。

第11章 继承和派生

第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章继承和派生

第11章继承和派生
《C++程序设计 》网 络 教 学
电子与信息工程系
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++程序设计 》网 络 教 学

第十一章继承和派生类-PPT精选文档

第十一章继承和派生类-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 C++语言程序设计(西电版)第11章 派生类与继承

C C++语言程序设计(西电版)第11章 派生类与继承
obj.showx(); obj.d.showx(); }
说明
当基类的构造函数不带参数时,派生类不一定需要 定义构造函数,然而当基类的构造函数那怕只带有 一个参数,它所有的派生类都必须定义构造函数, 甚至所定义的派生类的构造函数的函数体有可能为 空,仅仅起到参数传递作用。
若基类使用缺省构造函数或不带参数的构造函数, 则在派生类中定义构造函数时可略去,此时若派生 类也不需要构造函数,则可以不定义构造函数。
11.2.1构造和析构的次序
通常情况下,当创建派生类时,首先执行 基类的构造函数,随后再执行派生类的构 造函数;当撤销派生类对象时,则先执行 派生类的析构函数,随后再执行基类的析 构函数。
参见例11.6
【例11. 6】 掌握基类和派生类的构造函数和析构函数 的执行顺序。
#include <iostream.h> class base{ public:
class base{
//声明一个基类
int x;
public:
void setx(int n) {x=n;}
void showx() {cout<<x<<endl;}
};
class derived:private base{ //声明一个私有派生类
int y;
public:
void sety(int n) { y=n; }
如果派生类的基类也是一个派生类,则每个派生类 只需要负责直接基类的构造。
由于析构函数是不带参数的,在派生类中是否要定 义析构函数与它所属的基类无关。
11.3 多重继承
11.3.1 多重继承的声明
多重继承: 一个派生类具有多个基类。
class 派生类名:继承方式1 基类名1,…, 继承方式n 基类名n { 派生类新定义成员 };

C++课件第十一章继承和派生类

C++课件第十一章继承和派生类
在C++中,通过使用关键字“class”和“:”来定义派生类。派生类可以获得基类的 属性和方法,并且可以添加自己的新属性和方法。
基类和派生类之间的关系
基类是派生类的父类,派生类通过继承基类的属性和方法来实现代码的重用。基类和派生类之间是一种依赖关 系,派生类依赖于基类的存在。
派生类的构造函数和析构函数
C++课件第十一章继承和 派生类
继承是面向对象编程中一种重要的概念,它能够使得派生类从基类继承属性 和方法。本章将介绍继承的概念、派生类的定义和使用,以及派生类与基类 之间的关系。
继承的概念和作用
继承是一种重要的面向对象编程特性,它允许派生类继承基类的属性和方法, 从而实现代码的重用和扩展性。
派生类的定义和使用
成员变量
派生类可以继承基类的成员变量,并且可以添加 自己的新成员变量,从而实现更灵活的数据管理。
派生类的访问控制
派生类中的成员具有不同的访问权限,包括公有成员、保护成员和私有成员。通过合理设置访问权限,可以控 制派生类的接口和数据的访问范围。
多继承和虚继承
除了单继承外,C++还支持多继承和虚继承。多继承可以让派生类从多个基 类中继承属性和方法,而虚继承可以解决多继承中的二义性问题。
1
构造函数
派生类的构造函数用于初始化派生类对
析构函数
2
象,它会首先调用基类的构造函数,然 后执行派生类自身的初始化操作。
派生类的析构函数用于释放派生类对象
所占用的资源,它会首先执行派生类自
身的清理操作,然后调用基类的析构函
数。
派生类的成员函数和成员变且可以添加 自己的新成员函数,从而实现更丰富的功能。

C++课件第十一章继承和派生类

C++课件第十一章继承和派生类

派生类的构造函数和析构函数
1
派生类的构造函数
可以调用基类的构造函数,也可以不调用。如果不调用,编译器会自动生成一个无参构造函 数。
2
派生类的析构函数
会自动调用基类的析构函数。如果基类的析构函数是虚函数,就可以实现多态。
3
在构造函数和析构函数中,基类和派生类的对象的构造和析构顺序
先构造基类对象,再构造派生类对象。析构的顺序与构造相反。
子类从基类继承了部分接口和实 现。可以重用基类的代码,减少 代码冗余。
继承和派生类的区别
继承
子类是对基类的扩展,没有独立的意义。
公有继承
基类中的公有成员和保护成员都被子类继承, 子类对象可以直接访问。
派生
子类在基类的基础上,添加新的数据成员或成 员函数,形成新的类。
私有继承
基类中的公有成员和保护成员都被子类继承, 但在子类中不能直接访问基类的成员。
C++课件第十一章继承和 派生类
掌握继承和派生类的基本概念和应用,对于理解和设计面向对象的程序设计 有重要意义。
类的层次结构
C++类可以形成层次结构
子类可以继承基类的数据成员和 成员函数。
类的继承关系就像家族关系
基类是父亲,派生类是儿子。一 个类可以有多个子类。
建立类的层次结构有助于 程序设计的模块化
虚函数和多态性
虚函数
在基类中定义一个虚函数,在派 生类中重新定义这个函数。
运行时多态性
一个指向派生类对象的基类指针 可以调用派生类的虚函数,实现 多态。增强了代码的灵活性。
静态多态性
编译期间就决定了调用哪个函数。 如函数重载等。
抽象类和纯虚函数
抽象类

继承和派生ppt课件

继承和派生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"

第十一章继承和派生类-资料.ppt

第十一章继承和派生类-资料.ppt
继承为代码重用和建立类定义的层次结 构提供方便有效的手段。
例如公司的管理软件设计中需要定义一 个客户类 Customer 和雇员类 Employee:
class Customer
{
private: char name[15]; // 姓名 int age; // 年龄 char sex[8]; // 性别 double income; // 收入
public:
void print();
// 显示输出状态
};
两个类的数据成员和成员函数有许多相同之
处。显然,如此定义两个类,造成的代码重
复是不可避免的。
如果将 Customer 和 Employee 类定义中的相
同成员抽取出来,定义一个新类 Person:
class Person {
private:
1.派生类对象占有的存储空间 = 2.基类部分所有数据成员占有的存储空间 + 3.新定义部分所有数据成员占有的存储空间
11.4 派生类成员的访问属性
多重继承:有两个以 上基类的继承
基类与派生类的关系:
派生类是基类的具体化 基类是派生类的抽象 具有继承关系的类之间必定拥有以下基本
性质:
① 类间的共享特性; ② 类间的细微区别; ③ 类间的层次结构。
使用继承的必要性
若组成一个系统的对象类均为互不包含 的独立对象类,则将不可避免出现对象 属性和行为的重复冗余,并且这种无层 次关系的对象类既不符合现实世界的对 象关系,也使对象类的定义、创建、使 用和维护复杂化
{ <派生类新定义的成员>
};
派生类的定义与构成
继承方式规定了派生类中对基类成员进 行访问控制的方式。
继承方式包括三种:public(公有继承)、 private (私有继承)和protected (保护 继承)。如果省略继承方式,缺省的类 的继承方式是private。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ cout<<"age: "<<age<<endl; cout<<"address: "<<addr<<endl; } };
6
类A派生类B:类A为基类,类B为派生类。 B
A
新增加的成员数 据和成员函数
7
在C++语言中,一个派生类可以从一个基类
派生,也可以从多个基类派生。从一个基类
派生的继承称为单继承;从多个基类派生的
char name[30];
char sex;
public:
void display( )
//对成员函数display的定义
{cout<<"num: "<<num<<endl; cout<<"name: "<<name<<endl; cout<<"sex: "<<sex<<endl; } };
3
class Studend1 { int num; char sex; //此行原来己有 //此行原来己有 //此行原来己有 char name[20];
派生类外
不可引用 不可引用 不可引用
基类:public: (变为私有)在派生类中使用,类外不可使用 protected: (变为私有)在派生类中使用,类外不可使用 private: 不能在派生类中和类外使用
17
x(私私有) y(私有) private z(私有) A( ) 均为私有 Getx() 类B 外不 Gety() 能引用 ShowA() m(私有) x在类B新增加的成员中 n(私有) 不能直接调用 B() y在类B中可以调用 Show() z在类B中可以调用 Sum() 对类B的对象初始化即是对x,y,z,m,n等全部成员的初始化
int age;
char addr[20]; public:
void display( ) ;
//此行原来己有
{cout<<"num: "<<num<<endl; //此行原来己有 cout<<"name: "<<name<<endl;//此行原来己有
cout<<"sex: "<<sex<<endl;
18
A
x(私有) y(保护owA()
B
class A { int x; protected: int y; y是基类保护,所以在派生 public: int z; A(int a,int b,int c){x=a;y=b;z=c;}//基类初始化 类中可以直接引用。而在类 外不可直接引用。 int Getx(){return x;} //返回x int Gety(){return y;} //返回y void ShowA(){cout<< "x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n';} }; 私有派生 z是基类公有,私有 class B:private A{ 派生变为私有,所以 对基类初始化 int m,n; 在派生类中可直接引 public: B(int a,int b,int c,int d,int e):A(a,b,c){m=d;n=e;} 用,而在类外不可。 void Show(){cout<<“m="<<m<<'\t'<<“n="<<n<<'\n'; cout<<"x="<<Getx()<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } int Sum(){return ( Getx()+y+z+m+n);} }; 因为x是基类私有,所以在派生类和类外中不能直接引用 void main(void) 这些函数都是基类公有, { B b1(1,2,3,4,5); A a1(1,2,3); a1.ShowA(); 在类外不可使用。 b1.ShowA(); b1.Show(); cout<< "Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t'; 19 cout << "y=" <<b1.Gety()<<'\t'; cout << "z="<<b1.z<<'\n';}
继承称为多继承。
8
通过继承机制,可以利用已有的数据类型来
定义新的数据类型。所定义的新的数据类型
不仅拥有新定义的成员,而且还同时拥有旧
的成员。我们称已存在的用来派生新类的类
为基类,又称为父类。由已存在的类派生出
的新类称为派生类,又称为子类。
9
在建立派生类的过程中,基类不会做任何改 变,派生类则除了继承基类的所有可引用的 成员变量和成员函数外,还可另外定义本身 的成员变量和处理这些变量的函数,由于派 生类可继承基类的成员变量和成员函数,因
保护派生
保护派生,派生类中基类公有和保护成员降级使用
class ClassName: protected BaseClassName
保护派生时,基类中公有成员和保护成员在派生类中均变为保护的 在派生类中不可直接使用。
和私有的,在派生类中仍可直接使用这些成员,基类中的私有成员,
基类成员属性
公有 保护 私有
21
A
x(私有) y(保护) z(公有) A( ) Getx() Gety() ShowA()
B
protected 成员是一种具有血缘关系内外
有别的成员。它对派生类的对象而言, 是公开成员,可以访问,对血缘外部而
言,与私有成员一样被隐蔽。
22
抽象类与保护的成员函数 当定义了一个类,这个类只能用作基类来派 称这种类为抽象类。当对某些特殊的对象要
第十一章 继承和派生类
1
继承性是面向对象程序设计中最重要的机制。 这种机制提供了无限重复利用程序资源的一 种途径。通过C++语言中的继承机制,可以 扩充和完善旧的程序设计以适应新的需求。 这样不仅可以节省程序开发的时间和资源,
并且为未来程序增添了新的资源。
2
class Student
{ int num;
x在类B新增加的成员中不能直 接调用 y在类B中可以调用 z在整个文件中可以调用
x(私私有) y(保护) z(公有) A( ) Getx() Gety() ShowA() m(私有) n(私有) B() Show() Sum()
15
对类B的对象初始化即是对x,y,z,m,n等全部成员的初始化
class A { int x; protected: int y; 因为y是基类保护,所以在 public: int z; A(int a,int b,int c){x=a;y=b;z=c;}//基类初始化 派生类中可以直接引用。而 在类外不可直接引用。 int Getx(){return x;} //返回x int Gety(){return y;} //返回y void ShowA(){cout<< "x="<<x<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n';} }; 公有派生 因为z是基类公有, class B:public A{ 对基类初始化 所以在派生类中和类 int m,n; 外均可直接引用。 public: B(int a,int b,int c,int d,int e):A(a,b,c){m=d;n=e;} void Show(){cout<<“m="<<m<<'\t'<<“n="<<n<<'\n'; cout<<"x="<<Getx()<<'\t'<<"y="<<y<<'\t'<<"z="<<z<<'\n'; } int Sum(){return ( Getx()+y+z+m+n);} }; 因为x是基类私有,所以在派生类和类外中不能直接引用 void main(void) { B b1(1,2,3,4,5); b1.ShowA(); b1.Show(); cout<< "Sum="<<b1.Sum()<<'\n';cout<<"x="<<b1.Getx()<<'\t'; 16 cout << "y=" <<b1.Gety()<<'\t'; cout << "z="<<b1.z<<'\n';}
相关文档
最新文档