第4章_继承与派生4-12

合集下载

继承与派生

继承与派生
在基类中的访问属性 private private private protected protected protected public public public 继承方式 private protected public private protected public private protected public 在派生类中的访问方式 不可直接访问 不可直接访问 不可直接访问 private protected protected private protected public 在派生类外的访问方式 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 不可直接访问 public
4.1 继承和派生的概念
在软件开发过程中,在定义特殊类时,不需把它的一 般类已经定义过的属性和服务重复地书写一遍,只需要声 明它是某个类的特殊类,并定义它自己的特殊属性和服务。 这将明显地减轻开发工作的强度。 4.1.2 继承的作用 面向对象程序设计的继承性使得大型应用程序的维护 和设计变得更加简单。一方面,大型应用程序设计完成并 交付使用后,经常面临用户的需求发生变化,程序功能需 要扩充等问题。这时程序的修改需要非常谨慎,因为某个 局部的修改可能会影响其他部分,而一个正在使用中的系 统要进行全面的测试,既费时间又有很多实际的困难。另 一方面,一个新的应用系统程序设计在许多方面会和以前 设计过的某个或某些系统的模块非常类似,怎样加快大型 应用程序的开发速度,重用这些已经开发成功的程序模块, 一直是软件设计中迫切需要解决的问题。
4.2 派生类
C++语言派生类多重继承的定义格式如下: class <派生类名>:[继承方式1] [<基类名1>],[继承 方式2] [<基类名2>],…, [继承方式n] [<基类名n>] { <派生类成员变量和成员函数定义> }; 通常,在多重继承时,继承方式设计成一致的形式。 如继承方式均设计成public,或均设计成private。

《继承与派生 》课件

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

C _4_继承和派生

C  _4_继承和派生

第四章继承和派生§4—1 继承§4—2 单继承§4—3多继承§4—1 继承一、继承的含义①面向对象方法提供了从问题域到解域的自然映射客观世界中的对象既有共性,也有个性,通过不同程度的抽象,形成了分类和层次结构不同层次的类之间体现了概括(generalize)和特化(specify)关系把高层次的类称为父类、超类和基类,把由该类特化产生的低层次类称为子类或派生类派生类不仅具有基类的属性和行为,还具有自己特有的属性和行为②在不同类之间,除了概括和特化的关系外,还有聚合和分解关系模块化的主要目的是实现软件的可复用性从模块的角度看,继承是一种关键性的复用技术③继承机制提供了一种充分利用现有资源的方法它既体现了经济思想,又体现了谦虚精神:我比别人看得远,是因我站在巨人的肩上——牛顿继承使得在创建新类时,只需说明新类与基类的区别,从而大量原有代码都可复用④派生类是基类的具体化,是基类定义的延续在多继承时,派生类也是基类的组合二、继承的概念1.基类即父类,超类,是已存在的用来派生新类的类,是被继承的类2.派生类即子类,是由己存在的类派生出的新类,是继承其他类特性的类3.单继承即单重继承,每个派生类只有一个直接父类是从一个基类派生的继承,形成类的层次,像一棵树4.多继承即多重继承,派生类可以有多个直接父类是从多个基类派生的继承,形成一个有向无环图(DAG图)5.类的层次结构直接基类、间接基类、直接派生类、间接派生类多层继承:一个基类可以是另一个基类的派生类区别:多层继承和多重继承三、派生类的定义①单继承class 派生类名: 继承方式基类名{派生类新定义成员;};②多继承class 派生类名: 继承方式1 基类名1,继承方式2 基类名2,……{派生类新定义成员;};四、继承方式共有三种:公有继承:public保护继承:protected私有继承:private 可缺省继承方式基类特性派生类特性公有继承public publicprotectedprivatepublicprotected不可访问或不可见保护继承public protectedprotected protectedprivate protected 不可访问私有继承(缺省)private publicprotectedprivateprivateprivate不可访问派生类不能继承基类的构造函数、析构函数和友元1.基类的私有成员只能被基类中的成员函数和友元函数访问,不能被其他函数访问2.基类的保护成员只能被基类及其派生类中的成员函数和友元函数访问3.公有继承派生类的对象可以访问基类中的公有成员派生类的成员函数可以访问基类中的公有成员和保护成员4.保护继承和私有继承派生类的对象不能访问基类中的任何成员派生类的成员函数可以访问基类中的公有和保护成员5.私有继承基类的公有和保护成员只能由直接派生类访问,无法再往下继承§4—2 单继承每个派生类只有一个直接基类,但每个基类可以有多个派生类一、成员访问权限的控制二、成员访问权限的调整①保护继承和私有继承将改变基类的公有和保护成员在派生类中的访问权限属性,若欲恢复其访问权限,则应作调整②方法:在派生类相应访问权限段中加以说明:基类名:: 成员名;③访问声明只能对变量或函数名,不能说明类型和参数④基类成员被调整后,在派生类中的访问权限既不能扩大也不能减小,即不能改变所属权限段⑤私有成员的访问权限不可调整,不能对私有段成员作访问声明⑥重载函数只需一个声明即可,具有不同访问权限的重载函数名不能作访问声明三、派生类的成员(1)由两部分组成:①派生类从基类继承来的成员,其封装体叫基类子对象(匿名对象)②派生类自定义成员(2)派生类对象的内存长度是基类数据成员和派生类自定义数据成员的内存空间之和(3)基类的私有成员在派生类中存在,但不可访问,不可见(4)静态成员受访问权限符的限制,但不受继承方式的制约派生类可用“基类名:: 静态成员名”访问基类的static成员(5)派生类共有四种成员:①公有成员②保护成员③私有成员④不可直接访问的成员,它由基类私有成员派生而来的(6)派生类直接访问基类私有成员的方法:①将基类私有段成员放于基类保护段②将派生类或派生类的成员函数声明为基类的友元四、改造基类成员(1)通过继承方式来控制基类成员在派生类中的访问权限(2)对基类成员进行同名覆盖①在派生类中声明一个与基类成员同名的新成员以屏蔽(隐藏)基类同名成员②在派生类中或通过派生类对象只能访问到派生类中新定义的同名成员③若在派生类中欲调用被编译器隐蔽起来的基类同名成员,则应作访问声明,明确指定基类类范围:对象名.基类名:: 成员名对象名.基类名:: 成员函数名(参数表)④同名覆盖时要求派生类与基类同名的新成员函数原型相同,数据成员的名字和类型相同当同名的基类成员函数和派生类成员函数的参数个数、类型和顺序不完全相同时,则属于函数重载⑤当欲对从基类继承过来的某些函数功能进行扩充和改造时,都可用同名覆盖原则来实现五、派生类的构造函数(1)派生类对象的数据结构,由基类数据成员和派生类自定义数据成员共同构成(2)构造函数不能被继承,基类子对象只能通过基类构函来初始化,常以成员初始化列表方式进行(3)定义:派生类名(总参数表):基类名(参数表),子对象名(参数表2),……{派生类自定义数据成员的初始化;}(4)派生类构造函数的调用执行顺序:①基类构造函数:先兄长②子对象类的构函:后客人③派生类构函:最后自己(5)当基类有无参数或缺省构函或未显式定义任何构函时,派生类构函中可省去对基类构函的调用(6)当基类构函有参数时,则派生类必须定义构函,以提供参数传递的途径(7)当派生类的基类也是一个派生类时,则每个派生类只需负责其直接基类构函的调用六、派生类的析构函数(1)析构函数不能被继承,基类子对象只能通过基类析构函数类释放(2)析构函数调用执行顺序与构函相反:①派生类析构函数:先自己②子对象类析构函数:再客人③基类析构函数:最后兄长七、赋值相容原理(1)即当派生类从基类公有继承时,派生类对象可自动隐式地转换一个基类对象(2)当公有继承时,在需要基类对象的任何地方,都可以使用公有派生类的对象来替代即公有派生类对象可以作为基类对象使用,但只能使用从基类继承来的成员(基类子对象)(3)公有派生类的对象、对象指针、对象引用都适用于基类对象、对象指针、对象引用所能使用的场合(4)赋值相容性不可逆若欲将基类对象指针转换成公有派生类对象指针,则必须显式进行类型转换不允许用基类对象给派生类对象赋值(5)也称为子类型对父类型的类型适应①子类型:对类型S,当且仅当它至少提供了类型T的行为,则称S是T的子类型②公有继承时,基类为父类型,派生类为子类型,派生类适应于基类③类型适应:若一个函数可用于父类型的对象,则它也可用于其各个子类型的对象(6)是多态性的基础,提高了编程效率八、多层继承(1)所有派生类都只需对其直接基类负责:派生类构函只需向其直接基类传递参数(2)可实现抽象机制和软件重用机制§4—3多继承一、多继承即多重继承①是单继承的扩展和组合,单继承可看作是多继承的特例②派生类有两个或两个以上的直接基类③派生类与每个基类之间仍可看作单继承④赋值相容性原理对多继承同样成立⑤同名覆盖规则对多继承仍成立⑥一个类不能多次被说明为同一个派生类的直接基类,即一个类不可以从同一个类中直接继承一次以上(可改用子对象方式)⑦可采用DAG图示法来表示各个基类与派生类的关系:箭头指向基类⑧一个类可以多次成为同一个派生类的间接基类二、多继承的构造函数与析构函数(1)定义:派生类名(总参数表):基类名1(参数表1),基类名2(参数表2),…,子对象名(参数表n),……{派生类构造函数体;}(2)派生类构函调用执行顺序:(与单继承相同)①先执行基类构函:先兄长②再执行子对象类构函:再客人③最后执行派生类本身的构函:最后自己(3)处于同一层次的各基类构函的执行顺序取决于定义派生类时所指定的各基类顺序,与派生类构函定义的成员初始化列表各项顺序无关(4)析构函数的调用执行顺序与构函相反三、多继承中的二义性问题(1)即派生类对基类成员访问的不唯一性(继承的模糊性)(2)调用不同基类的相同成员时可能出现二义性措施:使用作用域运算符,用类名对成员加以限定3)访问共同基类的成员时可能出现二义性措施:①用类名限定法来消除二义性,只能用派生类的直接类名来限定②在派生类中重定义一个与基类中同名的成员,以覆盖之③将公共基类说明为虚基类,使之在派生类中只有一个拷贝4)二义性检查是在访问控制和类型检查之前进行的,故只要不同基类有同名成员时,均会出现二义性,即使只有一个可被派生类访问或只有一个名字的类型符合要求(5)存在二义性,则编译时出错§4—4 虚基类1.即虚拟基类2.若类A是派生类C多条继承路径上的一个公共基类,则A在C的对象中将产生多个基类子对象若欲使其只有一个拷贝,则需将A设置为虚拟基类3.引入虚基类的目的:解决二义性问题,使派生类中只有公共基类的一个数据副本4.定义:class 派生类名:virtual 继承方式基类名5.虚基类子对象只被初始化一次,虚基类构函也只被执行一次6.若虚基类构函带有参数,则其直接或间接派生类的构函成员初始化列表中均应列出对虚基类构函的调用,但只有最后派生出来的用于声明对象的类对虚基类构函的调用才会被执行7.在同一层次中,虚基类构函先于非虚基类构函执行8.可节省内存空间,程序也更简洁9.一个类在作为某些类的虚基类的同时,还可以作为另一些派生类的非虚基类10.若虚基类由非虚基类派生而来,则先调用基类构函,再调用派生虚基类构函11.virtual常用于声明虚基类的直接派生类,可放于继承方式前,也可放于继承方式后面12.多继承时,virtual后紧跟的基类为虚基类,若有多个虚基类,则应用多个virtual来说明13.若同一层次中有多个虚基类,则其构函执行顺序取决于派生类定义时指定的顺序。

南邮C++第4章_继承与派生

南邮C++第4章_继承与派生

本类中新增加成员
成员名 属性 private private
成员名及属性 成员名 数据成员 (共6个)
计 算 机 软 件 成员函数 基 础 (共5个) 教 学 中 心
protected speciality protected credit protected protected public
SetAddedValue public ChangeNum
9
4.1.1 为什么要使用继承

(2)单一继承与多重继承
单一继承是指派生类只从一个基类继承而来 多重继承指派生类同时从两个或更多的基类 继承而来


计 算 机 软 件 基 础 教 学 中 心
(3)多级继承

当类之间的继承关系超过两层时,就构成了 多级继承
10
4.1.2 派生类的定义
派生类的定义格式如下: class <派生类名>:[继承方式] <基类名1> [,[继承方式] <基类名2>,…,[继承方式] <基 类名n> ] { <派生类新增的数据成员和成员函数定义> }; 计 说明: 算 (1)定义派生类通常用关键字class,也可用 机 软 struct,二者的区别是:用class定义派生类,默 件 认的继承方式为private(私有继承方式),用 基 础 struct定义派生类,默认的继承方式为public 教 (公有继承方式),新增加的成员默认属性也是 学 class对应private(私有)属性,struct对应 中 心 public(公有)属性。
22
计 算 机 软 件 基 础 教 学 中 心
4.1.4 访问声明
本程序中涉及的类及继承关系如下图: Base类

《继承和派生》课件

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

第4章 派生类与继承

第4章 派生类与继承

如:
class employee:public person{ char department[20]; float salary; public: //… };
Previous Next Back
5
派生方式
1. 私有派生
class employee:private person{ //… };

//部门 //工资
直接定义employee类,代码重复非常严重。 使用继承:将employee说明成person类的派生类。 增加新的数据成员department和salary; 修改print成员函数。
Previ:
class 派生类名:派生方式 基类名{ //派生类新增的数据成员和成员函数 };
class B{ public: void setB(int x){ b=x; } void showB(){ } private: int b; };
class C : public A, private B{ public: void setC(int x, int y, int z) { //直接访问基类的公有成员 setA(x); setB(y); c=z;} void showC(){ } private: int c; }; void main() { C obj; obj.setA(5); obj.showA( ); obj.setC(6,7,9); obj.showC( ); obj.setB(6); //错误 obj.showB(); //错误 }
公有派生
class employee:public person{ //… }; public
基类
private a fun1() public c fun2() private

C类的继承和派生ppt课件

C类的继承和派生ppt课件
this->x=x;this->y=y; } void Point::Show() {
cout<<"("<<x<<","<<y<<")"<<en dl; }
-
//Circle.h文件 #ifndef CIRCLE_H #define CIRCLE_H #include <iostream> #include "Point.h" using namespace std; class Circle:public Point { protected:
name=nam; sex=s; } ~Student( ){ } protected: int num; string name; char sex ; };
-
class Student1: public Student { public:
Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)
using namespace
std;
{ protected:
class Base
int j;
{ protected:
int i; public:
void F()
public: void Fun() { i=20; }
};
{
void main()
} };
{ Drived d;
}
-
4.5 派生类的构造函数和析构函数
如程序PointRect1所示:
-
4.4继承方式

《继承和派生》PPT课件

《继承和派生》PPT课件

完整版ppt
15
继承和派生
练习、设计一个圆类,从圆派生圆柱(或圆 锥),并设计成员函数输出圆柱(或圆锥) 的底面面积和体积。
完整版ppt
16
继承关系中构造函数之间的关系
• 派生类不继承基类的构造函数 • 派生类和基类的构造函数之间是一种自动调用的
关系 • 创建派生类对象时,派生类构造函数要调用基类
成员M基类中的存取权 成员M 在private继承后

的派生类的存取权限
public
private
protected
private
private
隐藏
完整版ppt
12
受保护继承(protected)和派生
• 基类中公有成员和受保护成员被继承后都是受 保护的
成员M基类中的存取权限 成员M 在protected继承后 的派生类的存取权限
性和行为 • 派生类可以修改继承的属性和行为 • 派生类可以增加新的属性和行为 • 派生类对象也是基类对象 • 派生类对象和基类对象可以被统一管理
完整版ppt
4
继承和派生的基本概念
基类
数据成员 函数成员
派生类
基类
数据成员 函数成员
自己的数据成员 自己的函数成员
完整版ppt
5
继承的意义
• 便于管理系统中的对象 • 系统扩充比较容易- 利用程序代码的再用性
继承和派生
继承和派生的基本概念 单一继承定义 派生类重定义基类函数 基类中成员被继承后存取权限等级的变化 继承关系中构造函数、析构函数之间的关
系 多重继承
完整版ppt
1
继承的例子
• 家具和柜子 • 建筑和房子 • 道路和高速公路 • 动物和猫 • 电视和彩色电视 • 电脑和笔记本电脑
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8
4.1.2 派生类的定义
(4)派生类新增成员说明包括新增加的
数据成员和成员函数,可以有对基类成 员的访问声明,还可以有对基类中已有 成员函数的重新定义 (5)特别强调:基类不能被派生类继承 的两类函数是构造函数和析构函数
计 算 机 软 件 基 础 教 学 中 心
9
4.1.3 3种继承方式下基类成员在派生类中的访问属性
计 算 机 软 件 基 础 教 学 中 心
3
继承
一个新类从已有的类那里获得其已有特性, 这种现象称为类的继承。通过继承,一个新 建子类从已有的父类那里获得父类的特性。 从另一角度说,从已有的类(父类)产生一个 新的子类,称为类的派生。类的继承是用已 有的类来建立专用类的编程技术。派生类继 承了基类的所有数据成员和成员函数,并可 以对成员作必要的增加或调整。一个基类可 以派生出多个派生类,每一个派生类又可以 作为基类再派生出新的派生类,因此基类和 派生类是相对而言的。
7
4.1.2 派生类的定义
(2)继承方式指明了派生类是以什么方式继承 基类,有3种继承方式:public(公有继承方 式)、protected(保护继承方式)、private (私有继承方式) (3)继承方式不能被多个基类共享, 每个基 类名前给出继承方式关键字,否则用默认值

计 算 机 软 件 基 础 教 学 中 心
4
计 算 机 软 件 基 础 教 学 中 心
基类和派生类的关系
派生类是基类的具体化 基类则是派生类的抽象。
计 算 机 软 件 基 础 教 学 中 心
5
4.1.2 派生类的定义4.1

计 算 机 软 件 基 础 教 学 中 心
派生类的定义格式如下: class <派生类名>:[继承方式] <基类名 1> [,[继承方式] <基类名2>,…,[继承方式] <基类名n> ] { <派生类新增的数据成员和成员函数定义> };
26
4.3.3 多层次混合继承中的同名成员
【例4.10】多层次混合继承时同名成员二义性 解决方法示例 请在VC++6下演示运行,观察结果,类的继承 关系如下图所示

定义了数 据成员a
计 算 机 软 件 基 础 教 学 中 心
Base类 Base1类 Derived类
Base类 Base2类 继承了数 据成员a
17
课堂练习
P152
一(1)、(3) 153 四(2)
计 算 机 软 件 基 础 教 学 中 心
18
4.2.2 多重继承的派生类构造函数与析构函数4.7
多重继承与单一继承的最大区别就是——多重 继承下的派生类具有多个基类。 与单一继承相同的是:先调用基类构造函数、 再调用派生类对象成员所属类的构造函数、最 后调用派生类的构造函数 与单一继承不同的是:在多重继承中,派生类 有多个平行的基类,这些基类构造函数的调用 顺序,取决于声明派生类时所指定的各个基类 的顺序,而与在派生类构造函数的成员初始化 列表中调用基类构造函数的顺序无关 4.7
25
4.3.2 平行基类的同名成员
【例4.9】多重继承时多个平行基类中出现同名成员, 消除二义性示例 请在VC++6下演示运行,观察结果,类的继承关系如 下图所示

Base1类 定义了数据成员a
Base2类
定义了数据成员a
计 算 机 用Base1::a访问 用Base2::a访问 软 Derived类 件 Base1类中的a Base2类中的a 基 础 教 修改源程序,将派生类的构造函数中任何一处出现a 学 的地方直接用a而不加基类名::a来限定,重新编译, 中 心 观察出现的错误并分析原因
继承了数 据成员a
用Base1::a访问a 在Base1类中拷贝
用Base2::a访问a 在Base2类中拷贝
显然,a在Base1和Base2中存在不同拷贝,如何保证从 最顶层类到最底层类所有的a只有一份拷贝? 返回
27
4.4.1 虚基类的概念
一个基类在派生不同的派生类时,如果能
计 算 机 软 件 基 础 教 学 中 心
13
4.2.1 单一继承的派生类构造函数与析构函数 例4.4-4.5
计 算 机 软 件 基 础 教 学 中 心
14
4.2.1 单一继承的派生类构造函数与析构函数

定义派生类对象时构造函数的调用顺序如下:

计 算 机 软 件 基 础 教 学 中 心
① 首先调用基类的构造函数 ② 接着再调用派生类对象成员所属类的构造函数 (如果有对象成员) ③ 最后调用派生类的构造函数 在派生类对象生命期结束时析构函数的调用顺序如下: ① 首先调用派生类的析构函数 ② 接着再调用派生类对象成员所属类的析构函数 (如果有对象成员) ③ 最后调用基类的析构函数

16
计 算 机 软 件 基 础 教 学 中 心
4.2.1 单一继承的派生类构造函数与析构函数
(4)派生类构造函数体可能为空,若派生
计 算 机 软 件 基 础 教 学 中 心
类并没有增加任何新的数据成员,这时,构 造函数仍然必须要定义,此时只负责向基类 构造函数提供实在参数并调用基类构造函数 (3)如果通过派生类构造函数调用基类无 参的构造函数,则可以不给出显式调用形式, 系统将会自动调用 (6)在多层次的继承中,每一个派生类只 需要负责向直接基类的构造函数提供参数; 如果一个基类有多个派生类,则每个派生类 都要负责向该基类的构造函数提供参数 4.5
23
4.3.1 派生类和基类的同名成员

计 算 机 软 件 基 础 教 学 中 心
单一继承时派生类只有一个基类,若基类成员 与派生类成员同名,按如下规则进行处理: 派生类内定义了与基类同名的成员,该现象 称为同名覆盖。此时,无论派生类内部成员 函数还是派生类的对象访问同名成员,如果 未加任何特殊标识,则访问的是派生类中重 新定义的同名成员。如需要访问基类继承来 的同名成员,则必须在同名成员前面加上 “基类名::”进行类名限定。

19
计 算 机 软 件 基 础 教 学 中 心
4.2.2 多重继承的派生类构造函数与析构函数
例4.7中各类的继承关系如下图所示:
Grand类
Father类
计 算 机 软 件 基 础 教 学 中 心
Mother类 Son类
该例中类的继承关系既有多层次继承又有
单一继承和多重继承
20
4.2.2 多重继承的派生类构造函数与析构函数
protected
11
不可访问
不可访问
4.1.3 3种继承方式下基类成员在派生类中的访问属性
【例4.3】
计 算 机 软 件 基 础 教 学 中 心
12
4.2.1 单一继承的派生类构造函数与析构函数
基类中两个特殊函数——构造函数和析构
计 算 机 软 件 基 础 教 学 中 心
函数不能被派生类所继承,4.4。 在定义一个派生类对象时,依靠派生类的 构造函数完成对基类构造函数的调用以及 对自身新增加的数据成员的初始化。同样 派生类的析构函数会默认自动调用基类的 析构函数。

计 算 机 软 件 基 础 教 学 中 心
22
4.3 同名冲突及其解决方案4.8
由继承不可避免地带来了成员同名的问题
派生类继承了基类的数据成员和成员函数,
计 算 机 软 件 基 础 教 学 中 心
同时,又可以新增加新的成员,就有可能出 现新成员与从基类继承来的成员同名冲突的 问题 在多重继承中,若干个平行的基类中也可能 存在同名成员,这时在派生类中访问该成员 时存在的二义性问题 在多层次混合继承中,在第三层类中访问从 第一层类继承的成员时存在二义性问题

计 算 机 软 件 基 础 教 学 中 心

具体见下页表所示
10
4.1.3 3种继承方式下基类成员在派生类中的访问属性
基类中属性 继承方式 派生类中属性 派生类对象可 访问性
private
private private
计 算 机 软 件 基 础 教 学 中 心
public
private protected public private protected public
24
4.3.2 平行基类的同名成员
多重继承教 学 中 心
这些平行的基类中有可能出现同名成员。 这时,在派生类内部成员函数或派生类的 对象需要访问继承的同名成员时,如果直 接用成员名访问,就会产生二义性,因为 无法确定访问的是哪一个基类中的同名成 员,此时必须在同名成员名前面加上“基 类名::”进行类名限定,以明确所访问 的是哪一个基类中的同名成员。

基类成员在派生类中的访问属性取决于继承方 式以及这些成员本来在基类中的访问属性两个 方面,可以简单地用4句话来总结。
(1)基类的private成员无论何种继承方式在 派生类中均不可直接访问(inaccessible) (2)在公有继承方式下,基类的protected和 public成员在派生类中均保持原访问属性 (3)在保护继承方式下,基类的protected和 public成员在派生类中的访问属性均为 protected (4)在私有继承方式下,基类的protected和 public成员在派生类中均为private属性
6

计 算 机 软 件 基 础 教 学 中 心
说明: (1)定义派生类通常用关键字class,也 可用struct,二者的区别是:用class定义 派生类,默认的继承方式为private(私有 继承方式),用struct定义派生类,默认 的继承方式为public(公有继承方式), 新增加的成员默认属性也是class对应 private(私有)属性,struct对应public (公有)属性。
相关文档
最新文档