11、继承与派生 1)

合集下载

C第11章继承与派生PPT课件

C第11章继承与派生PPT课件
一个基类可以派生出多个派生类,每一个派 生类又可以作为基类再派生出新的派生类
继承的分类
❖单继承:一个派生类只从一个基类派生 ❖多继承:一个派生类从多个基类派生
单继承
多继承
大学在册人员实例
教职工(单继承)
在册人员 学生(单继承)
兼职教师(单继承)
教师(单继承) 工人(单继承) 行政人员(单继承) 研究生(单继承)
大多数工程都尽可能使用可以重用的部件
软件重用在以下层次中
❖代码
❖功能 ❖模块或类
难度增加
❖子系统
❖应用系统
C++提供的大量库函数是在功能级的重用
MFC、OLE、ActiveX是在类一级的重用
软件重用的含义 简单而言,就是以现成的程序模块为基础,实现新的应用系统
小型模块重用的示例 ❖各种库函数
❖在类中包含C另一+个+类的支对象持成员重用的机制 重用的关注点: --类的继承
int num; 这是“对象组合”的限制
类s的trin“g n继am承e; ”机制能通过“剪裁”派生需要的类
char sex;
BirthDate birthday;
};
§ 继承与派生的概念
继承就是在一个已存在的类的基础上建立一 个新的类
已存在的类称为基类(base class)或父类 (father class)
private: 子对象是“部件”
int int
ymeoanr;th组; 合产生的新类对象“包含”子对象,因此
int day; ❖新类对象具有子对象的属性和功能
}; class
Teacher//❖教新师类类对象能增加新属性与新功能
{ public: ❖新类对象不能“修改”子对象的功能

第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秒

第章继承和派生ppt课件

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

C++学习资料-继承和派生

C++学习资料-继承和派生
19:03
公有派生例
class A{ int a;
protected: int b;
public: int c;
...... };
class B:public A{ int x; ...... };
请问: A类中出现的成员变量 a,b,c等,在B类中分别具有何 种权限性质?
19:03
派生方式—B 私有派生
间接访问
private
通过基类的成员 函数访问
间接访问
19:03
11.1.3 抽象类
抽象类---不能创建对象,只作为基类:
类的构造函数或析构函数的权限是保护的 (protected)时,这种类为抽象类。
该类只能用作基类来派生出新的类,而不能用 作定义对象。为什么?
将该类定义为抽象类,可以对其成员进行很好 的封装,因为,其成员有该类本身和其派生类 两重权限保护。
私有派生(private):
基类中public和protected成员在派生类中都 变为private,在派生类中可以直接访问,但在 派生类外只能通过派生类中的public成员函数 来间接访问.
基类中的private成员,在派生类中只能通过基 类的public或protected成员函数来间接使用, 派生类外只能间接访问.
BaseClassName
是已定义的基类。
19:03
基类 派生类
11.1.4a成这员单4个,在重成继员承继是后私仍承有不派生类
class CRectangle{属于子类的cla成ss员C!Block:CpBulbolicckC类Re建ct立an对gl象e{
private:
private:
时如何初始化
19:03
私有派生例:

第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++课件第十一章继承和派生类
在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"

C++学习课件PPT11 继承和派生

C++学习课件PPT11 继承和派生
调用D类的析构 函数
B2类的析构 函数
B1类的析构 函数
析构函数的调用顺序与构造函数恰好相反。 • 子类的析构函数体执行完毕; • 依次执行各个基类的析构函数。
14:07
11.1.4d 多重继承的派生类
用多个基类派生出来的类。
class ClassName : <Access> Base1,…,<Access> Basen { private:
主程序中,各个类的构造函数及析构函 数调用顺序是什么?
续上例 构造函数调用顺序:
...... D(int a,int b):B1(a),B2(b)
{z=b;} ......
开始调用D类的 构造函数
B1类的构造 函数
B2类的构造 函数
执行D类的构 造函数体,结束 对象的构造。
14:07
续上例 析构函数调用顺序:
14:07
公有派生例
class A{ int a;
protected: int b;
public: int c;
...... };
class B:public A{ int x; ...... };
请问: A类中出现的成员变量 a,b,c等,在B类中分别具有何 种权限性质?
14:07
派生方式—B 私有派生
CRoundBlock
color
14:07
新增了radius
11.1.7 继承性小结
继承性提高程序代码和可重用性; 对象集中了数据与操作代码,使程序对象化后,
更易理解和维护; 注意:
注意复习理解——继承性; 继承方式不同引起的对成员的访问权限的变化,要注
意复习理解,并注重使用方法; 单重继承与多重继承,成员初始化: 语言书写格式规范、 使用方法

第十一章继承和派生类-资料.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)。
单级继承与多级继承:
单级继承:类之间的继承关系只有两层时 多级继承:类之间的继承关系超过两层时
学生 家具类
本科生
床类
单人床
基类与派生类的关系
基类与派生类的关系
派生类与基类存在一种是的关系,即派生类是基类的一 种(is a) 派生类是基类的特化,而基类是派生类的泛化 基类和派生类是相对的(如右图)
一个类中包含了若干数据成员和成员函数。在不同的类中, 数据成员和成员函数是不相同的。但有时两个类的内容基本 相同或有一部分相同。
为什么使用继承
Person +think() +work() Teacher +think() +work() -m_strName -m_bGender -m_iAge +Teach() -m_iSalary
派生类的声明(cont.)
class A {……}; class B:public A {……}; class A {……}; class B {……}; class C:public A,public B {……};
单继承只有 一个父类 多重继承时继承方式 不能被多个基类共享!
派生类的声明
说明 有三种继承方式public,private,protected 继承方式是可以省略的,如果省略则采用默认继承方式 (默认继承方式取决于struct,class) class声明类和struct声明类的区别 声明类的关键字 struct//不推荐 class 默认访问声明符 默认继承方式 public public
通过单继承Person类,我们实现了一个新类Teacher,那 么Teacher类的结构又是怎样的呢?都有那几部分组成呢
派生类中的成员
基类
Person 成员函数 数 据 成 员 +display() -m_strName -m_bSex -m_iAge 继承
派生类
Teacher +display() -m_strName -m_bSex -m_iAge +displayEx() -m_strAddr 新增成员 -m_strMajor
private
private
派生类的声明
class Student:Undergrad { int m_ival; void get() const; };
等价
class Student:private Undergrad { private: int m_ival; void get() const; };
#include <iostream> using std::cout; class A { 试图修改基类中的m_iVal从int变为 private: float是不可能的,B中有两个 int m_iVal; m_iVal ,关于更多内容后面介绍! }; class B:public A { double m_iVal; }; int main() { A a; B b; cout << sizeof(a) << " " << sizeof(b) << endl; return 0; }
学生
本科生 研究生
本次议题
继承与派生初步 为什么要使用继承
继承和派生的基本概念 基类与派生类的关系
派生类的声明 继承方式 访问声明和using 声明
派生类的声明
声明方式
单重继承声明
class <派生类名> :[继承方式]<基类名1> { 派生类新增加的成员 };
多重继承声明
class <派生类名>: [继承方式]<基类名1> ,[继承方式]<基类名2>,[... ..] { 派生类新增加的成员 };
成员函数 (共5个)
SetAddedValue ChangeNum PrintAddedValue
public public public
派生类的定义
课堂实验: ① 将上例中继承方式变为private,protected观察变化 ② 将student中的成员属性变为private观察变化
要解决上面问题我们必须了解三种继承方式
派 生 、 子 类
人类
继 承 的 层 次
继 承 、 父 类
工人
农民
教师
学生
电工
农民工
语文老师
化学老师
小学生
中学生
继承和派生的基本概念(cont.)
单重继承和多重继承:
单重继承:只有一个基类
学生 学生
本科生
本科生
研究生
多重继承:有多个基类
father mother
son
继承和派生的基本概念(cont.)
本次议题
继承与派生初步 为什么要使用继承
继承和派生的基本概念 基类与派生类的关系
派生类的定义 继承方式(重点) 访问声明和using 声明
继承方式
继承方式
公有继承(public) 保护继承(protected) 私有继承(private)
不同继承方式的影响主要体现在:
派生类对基类成员的访问控制 派生类对象对基类成员的访问控制
派生类中的成员
11_1
class Person { public: void display() const; protected: string m_strName; bool m_bSex; int m_iAge; };
class Teacher: public Person { public: void displayEx() const; private: string m_strAddr; string m_strMajor; int m_iSalary; }
继承和派生的基本概念
继承就是在一个已存在的类的基础上建立一个新的 类。
已存在的类称为基类(base class)或父类(father class)。 新建立的类称为派生类(derived class)或子类 (son class) 。
派生就是从已有的类(父类)产生一个新的子类。
继承和派生的基本概念(cont.)
派生类的继承过程
继承过程
吸收基类成员
派生类把基类全部的成员(不包括构造函数和析构函数)接收过来。
DEMO 11_1
调整基类成员
– 调整基类public和protected成员的访问权限 – 隐藏同名基类成员
增加基类成员
– 这部分内容是很重要的,是派生类对基类功能的扩展。要根据需 要仔细考虑应当增加哪些成员。在声明派生类时,一般还应当自 己定义派生类的构造函数和析构函数,因为构造函数和析构函数 是不能从基类继承的。
class Teacher : public Person { public: void teach(); private: int m_iSalary; };
本次议题
继承与派生初步 为什么要使用继承
继承和派生的基本概念 基类与派生类的关系
派生类的定义 继承方式 访问声明和using 声明
派生类的定义
成员来源 成员名及属性 数据成员 (共6个) 从基类继承得到 成员名 name sex age num SetValue PrintValue 属性 protected protected protected protected public public
属性下节讨论 本类中新增加 成员名 speciality credit 属性 private private
继承方式
类成员的访问属性
访问声明符 private protected public 本类成员函数 Y Y Y 类作用域外 N N Y 友元 Y Y Y
公有继承(public)
如果以公有方式继承则基类中的public和protected在派生 类中保持不变,私有成员在派生类中为不可访问 (inaccessible)
-m_iSalary
派生类的声明
#include <iostream> #include <string> using namespace std; class Person { public: Person( string aName=“”, bool aSex=true, int aAge=0 ); void display() const; protected: string m_strName; bool m_bSex; int m_iAge; }; Person::Person( string aName,bool aSex,int aAge ) :m_strName(aName), m_bSex(aSex), m_iAge(aAge) { } void Person::display() const { cout << m_strName << endl; string sex; if( m_bSex ) sex = "male"; else sex = "famale"; cout << sex << endl; cout << m_iAge << endl; }
基类成员访问控制 public protected private 公有继承(public) 派生类成员访问属性 public protected inaccessible 类外访问属性 public inaccessible inaccessible
说明: inaccessible成员不能被子类成员函数直接访问, 但可通过基类成员函数间接访问
派生类的声明
class Teacher: public Person { public: Teacher( string aName, int aSex, int aAge, string aAddr, string aMajor, int aSalary ); void displayEx() const; protected: string m_strAddr; string m_strMajor; int m_iSalary; }; Teacher::Teacher( string aName, bool aSex, int aAge, string aAddr,string aMajor,int aSalary ) :Person( aName, aSex, aAge ), m_strAddr(aAddr), m_strMajor(aMajor),m_iSalary(aSalary) { } void Person::displayEX() const { display(); cout << m_strAddr << endl; cout << m_strMajor << endl; cout << m_iSalary << endl; }
相关文档
最新文档