第8章 继承性和派生类

合集下载

Visual C++继承性与派生类

Visual C++继承性与派生类

继承性与派生类9.1 继承性与派生类的基本概念继承是软件复用的一种形式,它是从现有类的基础上建立新类,新类继承了现有类的属性和方法,并且还拥有其特有的属性和方法。

继承的过程称为派生,新建的类为派生类(或子类),原有的类称为基类(或父类)。

继承可分为:单继承和多重继承。

若派生类只有一个基类则称为单继承;若派生类有多个基类则称为多重继承。

9.2 派生类的声明与访问权限9.2.1 派生类的声明单继承中派生类的定义格式为:class <派生类名>:<派生方式><基类名>{派生类新定义的成员声明;};说明:①派生方式关键字为private、public和protected,分别表示私有继承、公有继承和保护继承。

缺省的继承方式是私有继承。

继承方式规定了派生类成员和类外对象访问基类成员的权限。

②派生类新定义的成员是指继承过程中新增加的数据成员和成员函数。

通过在派生类中新增加成员实现功能的扩充。

9.2.2 派生类的访问权限公有继承(public)①继承后基类的公有成员、私有成员、保护成员在派生类中访问权限保持不变。

②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。

③在基类和派生类定义以外只能通过派生类的对象访问基类的公有成员,无法通过派生类对象直接访问基类的私有成员和保护成员。

私有继承(private)①继承后基类的所有成员在派生类中均为私有成员。

②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。

③在基类和派生类定义以外对基类的所有成员均无法直接访问也无法通过派生类的对象间接访问。

保护继承(protected)①继承后基类的公有成员和保护成员在派生类中均为保护成员,基类的私有成员在派生类中仍为私有成员。

②在派生类中可以直接访问基类的公有成员和保护成员,但对于私有成员的访问只能通过基类的非私有成员函数间接访问。

继承和派生的作用

继承和派生的作用

继承和派生的作用继承和派生是面向对象编程中常用的两个概念,它们在软件开发中起着重要的作用。

继承是指一个类从另一个类继承属性和方法的过程,派生是指在继承的基础上创建新的类的过程。

本文将分别介绍继承和派生的作用。

一、继承的作用1. 代码复用:通过继承,子类可以继承父类的属性和方法,避免了重复编写相同代码的麻烦。

这样可以提高代码的复用性,减少了代码量,提高了开发效率。

2. 继承关系的表达:通过继承,可以清晰地表达类与类之间的关系。

子类继承了父类的属性和方法,说明它们之间有某种联系,有共同的特征或行为。

3. 扩展功能:通过继承,子类可以在父类的基础上新增或修改属性和方法,实现功能的扩展。

这样可以满足不同的需求,增加了代码的灵活性。

4. 统一接口:通过继承,可以定义一个抽象的父类,然后定义多个子类来实现具体的功能。

这样可以实现统一的接口,使代码更加规范和易于管理。

5. 多态性的实现:继承是实现多态性的基础。

子类可以替代父类的位置,通过父类的引用来调用子类的方法。

这样可以实现动态绑定,提高了代码的灵活性和可扩展性。

二、派生的作用1. 创建新的类:派生是在继承的基础上创建新的类的过程。

通过派生,可以基于已有的类创建新的类,并在新的类中添加、修改或重新实现属性和方法。

2. 特化和泛化:通过派生,可以根据具体的需求创建特定的类。

例如,可以从一个通用的动物类派生出狗类和猫类,使它们具有更具体的属性和方法。

同时,也可以从一个具体的类派生出一个更通用的类,使它具有更广泛的适用性。

3. 继承关系的传递:通过派生,可以传递继承关系。

即子类可以继续被其他类所派生,形成更深层次的继承关系。

这样可以实现更复杂的类之间的继承和关联。

4. 重载和重写:通过派生,可以重载和重写父类的方法。

重载是指在子类中定义一个与父类同名但参数列表不同的方法,以实现不同的功能。

重写是指在子类中重新定义一个与父类同名同参数列表的方法,以实现不同的行为。

《继承与派生 》课件

《继承与派生 》课件
《继承与派生》PPT 课件
目录
CONTENTS
• 继承与派生的基本概念 • 继承的方式 • 派生类的构造函数和析构函数 • 继承与多态 • 继承与重载
01
继承与派生的基本 概念
继承的定义
继承是面向对象编程中的一个重 要概念,它允许一个类(子类) 继承另一个类(父类)的属性和
方法。
通过继承,子类可以复用父类的 代码,减少代码冗余,提高代码
保护继承
总结词
保护继承是指基类的保护成员在派生类 中保持保护属性,可以被派生类和派生 类的对象访问。
VS
详细描述
保护继承时,基类的保护成员在派生类中 保持保护属性,可以被派生类和派生类的 对象访问。这种继承方式使得基类的保护 成员成为派生类的保护成员,可以被派生 类和派生类的对象访问。因此,派生类可 以继承基类的保护成员函数和变量。
03
派生类的构造函数 和析构函数
派生类的构造函数
派生类构造函数的作用
派生类构造函数用于初始化派生类对象,包括调用基类构造函数 和执行派生类特有的初始化操作。
派生类构造函数的执行顺序
派生类构造函数的执行顺序是在创建派生类对象时,先调用基类构 造函数,然后执行派生类构造函数体中的代码。
派生类构造函数的参数
继承和派生共同实现 了面向对象编程中的 代码复用和多态性。
派生是继承的一种表 现形式,通过派生可 以创建新的类。
02
继承的方式
公有继承
总结词
公有继承是ቤተ መጻሕፍቲ ባይዱ基类的公有成员在派生类中仍为公有成员,可以被派生类和派生类的对象访问。
详细描述
公有继承时,基类的公有成员在派生类中保持公有属性,派生类可以访问基类的公有和保护成员。这种继承方式 使得基类的公有成员成为派生类的公有成员,可以被派生类和派生类的对象直接访问,因此派生类可以继承基类 的公有成员函数和变量。

继承与派生练习题

继承与派生练习题

习题八第八章继承与派生1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变)是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员)A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性)是错误的。

A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。

A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数5. C++类体系中,能被派生类继承的是( B.虚函数)。

A.构造函数 B.虚函数 C.析构函数 D.友元函数6. 设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承)A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7. 指出下列对定义重载函数的要求中,哪些是错误的提法。

A.要求参数的个数不同B. 要求参数中至少有一个类型不同。

A.要求参数的个数不同。

B.要求参数中至少有一个类型不同。

C.不要求函数的返回值不同。

《继承性和派生性》PPT课件

《继承性和派生性》PPT课件

继承方式: public private
protected 直接继承
(P)
6
8.1.2 派生类的三种继承方式(续)
表:继承对基类成员的访问能力
公有继承 私有继承 保护继承
J PHV J PHV J PHV
私有 成员
公有 成员
√√√√√√ (私)
√√ (保)

保护 成员



(私)


精选课件ppt
<派生类新定义成员> };
2、多继承
class <派生类名>:<继承方式1> <基类名1>, <继承方式2> <基类名2>...
{ <派生类新定义成员>
};
精选课件ppt
3
8.1.1 派生类的定义格式(续)
3、继承方式 public:公有继承;
private:私有继承;
protected:保护继承; 作用:控制基类中声明的成员在多大的范围内 能被派生类的用户访问;
7
8.1.2 派生类的三种继承方式(续)
说明: 私有成员不参与继承的访问控制;
基类实例(J):与继承方式无关,遵循访问控制 权限的定义;
直接继承(P):可以访问基类中的公有成员和 保护成员,但成员的权限随继承方式而改变;
水平访问(H)=P+J;
垂直访问(V)=P+P;
保护成员:在垂直访问(V)时相当于公有成员, 在水平访问(H)时相当于私有成员;
14
8.1.2 派生类的三种继承方式(续)
{ Location::Move(xOff,yOff); }
int GetX() {return Location::GetX();}

继承与派生类答案

继承与派生类答案

继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。

(1)掌握继承的两种类型:单继承和多继承。

(2)掌握private,public,protected三种继承方式的特点。

继承方式决定了基类中的成员在派生类中的属性。

三种继承方式的共同点:基类的private成员在派生类中不可见。

区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。

(3)掌握派生类中的构造函数和析构函数的使用。

基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。

派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。

(4)掌握派生类的同名覆盖规则。

(5)掌握赋值兼容规则。

基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。

2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。

3.掌握虚基类的概念和定义方法。

在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。

典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。

《继承和派生》课件

《继承和派生》课件
时提供默认值。
派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项

继承与派生类答案

继承与派生类答案

继承与派生类知识要点1.掌握继承和派生的定义,派生类的定义方法。

(1)掌握继承的两种类型:单继承和多继承。

(2)掌握private,public,protected三种继承方式的特点。

继承方式决定了基类中的成员在派生类中的属性。

三种继承方式的共同点:基类的private成员在派生类中不可见。

区别:对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。

(3)掌握派生类中的构造函数和析构函数的使用。

基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。

派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。

(4)掌握派生类的同名覆盖规则。

(5)掌握赋值兼容规则。

基类对象可以使用公有派生类对象来代替,包括:派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。

2.掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。

派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。

3.掌握虚基类的概念和定义方法。

在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。

典型例题分析与解答例题1:下列对派生类的描述中,()是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D分析:一个派生类可以作为另一个派生类的基类。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++程序设计—继承性和派生类 16
例8.3 私有继承2
void main() { A a; a.setx(5); a.showx(); B b; b.setxy(10,20); b.showx(); b.showxy(); cout<<"\n\n\t"; }
访问权限 出错!?
C++程序设计—继承性和派生类
C++程序设计
第8章 继承性和派生类
主要内容
8.1 基类和派生类 8.2 单继承
8.3 多继承
8.4 虚基类
8.5 冲突、支配规则和赋值兼容规

C++程序设计—继承性和派生类
2
基类和派生类
类的继承与派生是指:新类继承了原有类的特征,或者由原有类派生出新类。 原有类:基类或父类。 新类:派生类或子类。 派生新类的过程一般包括三个步骤:吸收原有类的成员;调整原有类的成员; 添加新的成员。
class Dr1:public Base1,private Base2
{ public: Dr1(); ~Dr1(); };
C++程序设计—继承性和派生类 4
基类和派生类
二、派生类的生成过程 1、继承基类成员 除构造函数、析构函数之外,其余的所有成员都被继承。 2、改造基类成员
改造基类成员的访问控制:依靠定义派生类时的继承方式实
现。 覆盖基类成员:在派生类中定义与基类成员同名的成员,发 生同名覆盖。 3、添加新成员
C++程序设计—继承性和派生类
5
单继承
1 继承方式 2 派生类构造函数和析构函数
C++程序设计—继承性和派生类
6
单继承 -继承方式
一、公有继承:基类成员与派生类成员的关系:
为任 何类 成员 访问 public派生 只为基类 成员访问 为基类及派生 类、派生子类 成员访问
为基类 及派生 类、派 生子类 成员访 问 protected 派生 只为基类 成员访问 基类
为基类及派生 类、派生子类 成员访问 黄色:为基类中的私有成员,也为派生类的不可访问成员
派生类
浅红色:为派生类中特有成员
橙色:为基类的公有成员,也为派生类的保护成员 红色:为基类的保护成员,也为派生类的保护成员
C++程序设计—继承性和派生类 21
例8.4 保护继承 派生类的对象不能 void main( ) 访问,但能为 { graduatestudent 派生的子类访问 graduatestudent zh; //生成派生类对象 //zh. Getage(19,'M')( ); // 即:student::Getage( ); 不能访问 zh.Getnum(12); //访问派生类中的公有成员 //cout<<zh.sex; //即:student::sex,error保 护成员 //cout<<zh.stunum; //error 私有成员 //cout<<zh.age; //即:student::age,error }
17
单继承-继承方式
三、保护继承
基类的私有成员不可访问,基类的其它成员都以保护
成员的身份出现。
保护成员:对于派生类来说,基类的保护成员象公有
成员一样可以被直接访问;但在类的外部,类的保护成员 象私有成员一样不能被访问。
C++程序设计—继承性和派生类
18
单继承-继承方式
保护继承基类成员与派生类成员的关系:
C++程序设计—继承性和派生类
10
单继承 -继承方式
二、私有继承
基类的私有成员不可访问,基类的其它成 员都以私有成员的身份出现。
C++程序设计—继承性和派生类
11
单继承-继承方式
私有继承基类成员与派生类成员的关系:
只为基 类及派 生类成 员访问 private派生 只为基类 成员访问 基类
派生类
C++程序设计—继承性和派生类 14
ቤተ መጻሕፍቲ ባይዱ
覆盖基 类成员
void Move(float xOff, float yOff) {Point::Move(xOff,yOff);}
例8.2 私有继承1
void main() { Rectangle rect; //定义Rectangle类的对象 rect.InitR(2,3,20,10);//设置矩形的数据 rect.Move(3,2); //移动矩形位置 cout<<"\tThe data of rect(X,Y,W,H):"<<endl; cout<<"\t"<<rect.GetX()<<","//输出矩形的特征参数 <<rect.GetY()<<"," <<rect.GetW()<<"," <<rect.GetH()<<endl; cout<<"\n\n\t"; }
C++程序设计—继承性和派生类 13
例8.2 私有继承1
void InitR(float x, float y, float w, float h){InitP(x,y);W=w;H=h;} //派生类访问基类公有成员 float GetX() {return Point::GetX();} float GetY() {return Point::GetY();} float GetH() {return H;} float GetW() {return W;} private: //新增私有数据 float W,H; };
C++程序设计—继承性和派生类
9
例8.1 公有继承
rect.Move(3,2); //移动矩形位置 cout<<"\tThe data of rect(X,Y,W,H):"<<endl; cout<<"\t"<<rect.GetX()<<","//输出矩形的特征参数 <<rect.GetY()<<"," <<rect.GetW()<<"," 基类的 <<rect.GetH()<<endl; cout<<"\n\n\t"; }
为基类及派生 类成员访问 黄色:为基类中的私有成员,也为派生类的不可访问成员 蓝色:为派生类中特有成员
草绿色:为基类的公有成员,也为派生类的私有成员 红色:为基类的保护成员,也为派生类的私有成员
C++程序设计—继承性和派生类 12
• 例8.2 私有继承1
#include<iostream.h> class Point //基类声明 { public: void InitP(float xx=0, float yy=0) {X=xx;Y=yy;} void Move(float xOff, float yOff) {X+=xOff;Y+=yOff;} float GetX() {return X;} float GetY() {return Y;} private: float X,Y; }; class Rectangle: private Point //派生类声明 { public: //新增外部接口
一、派生类的定义 class 派生类名:继承方式 基类名1,…,继承方式 基类名n { 派生类成员定义; };
C++程序设计—继承性和派生类
3
基类和派生类
单继承:派生类只有一个基类的情况。 多继承:派生类同时有多个基类的情况。 继承方式:访问控制的方式(public,protected,private),缺省情况下,认 为是private继承。 一个多继承实例:
C++程序设计—继承性和派生类
8
例8.1 公有继承
//派生类声明部分 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;} private: //新增私有数据成员 float W,H; }; void main(void) { Rectangle rect; //定义Rectangle类的对象 rect.InitR(2,3,20,10); //设置矩形的数据
C++程序设计—继承性和派生类 19
• 例8.4 保护继承
如:#include<iostream.h> class student { private: int age; protected: char sex; public: int Getage(int a,char s) { age=a; sex=s; return age; } }; class graduatestudent: protected student { private: int stunum; public: void Getnum(int st); };
派生 类的
C++程序设计—继承性和派生类
15
相关文档
最新文档