第11讲-继承与派生(2)上课讲义
合集下载
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: ❖新类对象不能“修改”子对象的功能
继承的分类
❖单继承:一个派生类只从一个基类派生 ❖多继承:一个派生类从多个基类派生
单继承
多继承
大学在册人员实例
教职工(单继承)
在册人员 学生(单继承)
兼职教师(单继承)
教师(单继承) 工人(单继承) 行政人员(单继承) 研究生(单继承)
大多数工程都尽可能使用可以重用的部件
软件重用在以下层次中
❖代码
❖功能 ❖模块或类
难度增加
❖子系统
❖应用系统
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章 继承与派生讲义.
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 课件
目录
CONTENTS
• 继承与派生的基本概念 • 继承的方式 • 派生类的构造函数和析构函数 • 继承与多态 • 继承与重载
01
继承与派生的基本 概念
继承的定义
继承是面向对象编程中的一个重 要概念,它允许一个类(子类) 继承另一个类(父类)的属性和
方法。
通过继承,子类可以复用父类的 代码,减少代码冗余,提高代码
保护继承
总结词
保护继承是指基类的保护成员在派生类 中保持保护属性,可以被派生类和派生 类的对象访问。
VS
详细描述
保护继承时,基类的保护成员在派生类中 保持保护属性,可以被派生类和派生类的 对象访问。这种继承方式使得基类的保护 成员成为派生类的保护成员,可以被派生 类和派生类的对象访问。因此,派生类可 以继承基类的保护成员函数和变量。
03
派生类的构造函数 和析构函数
派生类的构造函数
派生类构造函数的作用
派生类构造函数用于初始化派生类对象,包括调用基类构造函数 和执行派生类特有的初始化操作。
派生类构造函数的执行顺序
派生类构造函数的执行顺序是在创建派生类对象时,先调用基类构 造函数,然后执行派生类构造函数体中的代码。
派生类构造函数的参数
继承和派生共同实现 了面向对象编程中的 代码复用和多态性。
派生是继承的一种表 现形式,通过派生可 以创建新的类。
02
继承的方式
公有继承
总结词
公有继承是ቤተ መጻሕፍቲ ባይዱ基类的公有成员在派生类中仍为公有成员,可以被派生类和派生类的对象访问。
详细描述
公有继承时,基类的公有成员在派生类中保持公有属性,派生类可以访问基类的公有和保护成员。这种继承方式 使得基类的公有成员成为派生类的公有成员,可以被派生类和派生类的对象直接访问,因此派生类可以继承基类 的公有成员函数和变量。
目录
CONTENTS
• 继承与派生的基本概念 • 继承的方式 • 派生类的构造函数和析构函数 • 继承与多态 • 继承与重载
01
继承与派生的基本 概念
继承的定义
继承是面向对象编程中的一个重 要概念,它允许一个类(子类) 继承另一个类(父类)的属性和
方法。
通过继承,子类可以复用父类的 代码,减少代码冗余,提高代码
保护继承
总结词
保护继承是指基类的保护成员在派生类 中保持保护属性,可以被派生类和派生 类的对象访问。
VS
详细描述
保护继承时,基类的保护成员在派生类中 保持保护属性,可以被派生类和派生类的 对象访问。这种继承方式使得基类的保护 成员成为派生类的保护成员,可以被派生 类和派生类的对象访问。因此,派生类可 以继承基类的保护成员函数和变量。
03
派生类的构造函数 和析构函数
派生类的构造函数
派生类构造函数的作用
派生类构造函数用于初始化派生类对象,包括调用基类构造函数 和执行派生类特有的初始化操作。
派生类构造函数的执行顺序
派生类构造函数的执行顺序是在创建派生类对象时,先调用基类构 造函数,然后执行派生类构造函数体中的代码。
派生类构造函数的参数
继承和派生共同实现 了面向对象编程中的 代码复用和多态性。
派生是继承的一种表 现形式,通过派生可 以创建新的类。
02
继承的方式
公有继承
总结词
公有继承是ቤተ መጻሕፍቲ ባይዱ基类的公有成员在派生类中仍为公有成员,可以被派生类和派生类的对象访问。
详细描述
公有继承时,基类的公有成员在派生类中保持公有属性,派生类可以访问基类的公有和保护成员。这种继承方式 使得基类的公有成员成为派生类的公有成员,可以被派生类和派生类的对象直接访问,因此派生类可以继承基类 的公有成员函数和变量。
第章继承和派生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()
继承与派生课件
继承与派生
派生类
3
继承与派生问题举例
类
的
动物
继
承
与
派
猴子
猫猫科
鸟
生
狮子
虎
猎豹
继承与派生
4
继承与派生问题举例
类
的 继
几 何形状
承
与
派
生
圆
矩形
继承与派生
5
继承与派生问题举例
类 的 继
承 与 派 兼职技术人员
生
雇员 管理人员
销售经理
继承与派生
单继承
销售人员
多继承
6
类的继承与派生
• 保持已有类的特性而构造新类的过程称为继承。 • 在已有类的基础上新增自己的特性而产生新类的过程称为派生。 • 被继承的已有类称为基类(或父类)。 • 派生出的新类称为派生类(或子类)。
float getX() const { return x; }
员
float getY() const { return y; }
private:
//私有数据成员
的 访 问 控 制
派
float x, y;
};
生
class Rectangle: public Point {
//派生类定义部分
类
public:
继承与派生
7
继承与派生的目的
类 • 继承的的目的:实现代码重用。 • 派生的继 承目的:当新的问题出现,原有程序无法解决(或不能完全 解决)与时,需要对原有程序进行改造。
派 生
继承与派生
8
派生类的声明
类
的 class 派生类名:继承方式1 基类名1, 继承方式2
《继承和派生》课件
时提供默认值。
派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项
派生类的析构函数
派生类析构函数在销毁派生类对象时 自动调用,用于释放派生类所占用的 资源。
派生类析构函数可以包含代码,用于 清理派生类所占用的资源。
派生类析构函数可以访问基类的析构 函数,通过使用`this`关键字调用基类 析构函数。
派生类析构函数可以重载基类析构函 数,以便在销毁派生类对象时执行特 定的操作。
基类析构函数的调用
在派生类的析构函数中,可以通过使用`this`关键字调 用基类的析构函数,以确保基类资源得到正确释放。
输标02入题
如果在派生类的析构函数中没有显式调用基类的析构 函数,则编译器会自动调用基类的默认析构函数。
01
03
在某些情况下,可能需要显式调用基类的析构函数, 以确保资源得到正确释放。例如,当基类包含动态分
02 继承的方式
公有继承
总结词
公有继承是指子类可以访问父类的公有成员。
详细描述
在公有继承中,子类可以访问父类的公有成员(即不加任 何修饰符的成员),这些成员在子类中保持公有属性。子 类可以继承和使用父类的公有成员,包括函数、变量、常 量等。
总结词
公有继承是实现代码复用的一种方式。
详细描述
通过公有继承,子类可以继承父类的公有成员,从而避免 重复编写相同的代码。这有助于提高代码的复用性和维护 性。
注意事项
虚函数和纯虚函数的使用 应合理规划,避免过度使 用导致程序复杂度和维护 成本增加。
继承和派生的效率问题
继承
通过共享已存在的代码, 减少代码冗余。但也可能 导致内存浪费和性能下降 。
派生
通过扩展已有类,增加新 功能或修改已有功能。但 也可能导致内存消耗增加 和性能下降。
注意事项
第十一章继承和派生类-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++中,通过使用关键字“class”和“:”来定义派生类。派生类可以获得基类的 属性和方法,并且可以添加自己的新属性和方法。
基类和派生类之间的关系
基类是派生类的父类,派生类通过继承基类的属性和方法来实现代码的重用。基类和派生类之间是一种依赖关 系,派生类依赖于基类的存在。
派生类的构造函数和析构函数
C++课件第十一章继承和 派生类
继承是面向对象编程中一种重要的概念,它能够使得派生类从基类继承属性 和方法。本章将介绍继承的概念、派生类的定义和使用,以及派生类与基类 之间的关系。
继承的概念和作用
继承是一种重要的面向对象编程特性,它允许派生类继承基类的属性和方法, 从而实现代码的重用和扩展性。
派生类的定义和使用
成员变量
派生类可以继承基类的成员变量,并且可以添加 自己的新成员变量,从而实现更灵活的数据管理。
派生类的访问控制
派生类中的成员具有不同的访问权限,包括公有成员、保护成员和私有成员。通过合理设置访问权限,可以控 制派生类的接口和数据的访问范围。
多继承和虚继承
除了单继承外,C++还支持多继承和虚继承。多继承可以让派生类从多个基 类中继承属性和方法,而虚继承可以解决多继承中的二义性问题。
1
构造函数
派生类的构造函数用于初始化派生类对
析构函数
2
象,它会首先调用基类的构造函数,然 后执行派生类自身的初始化操作。
派生类的析构函数用于释放派生类对象
所占用的资源,它会首先执行派生类自
身的清理操作,然后调用基类的析构函
数。
派生类的成员函数和成员变且可以添加 自己的新成员函数,从而实现更丰富的功能。
基类和派生类之间的关系
基类是派生类的父类,派生类通过继承基类的属性和方法来实现代码的重用。基类和派生类之间是一种依赖关 系,派生类依赖于基类的存在。
派生类的构造函数和析构函数
C++课件第十一章继承和 派生类
继承是面向对象编程中一种重要的概念,它能够使得派生类从基类继承属性 和方法。本章将介绍继承的概念、派生类的定义和使用,以及派生类与基类 之间的关系。
继承的概念和作用
继承是一种重要的面向对象编程特性,它允许派生类继承基类的属性和方法, 从而实现代码的重用和扩展性。
派生类的定义和使用
成员变量
派生类可以继承基类的成员变量,并且可以添加 自己的新成员变量,从而实现更灵活的数据管理。
派生类的访问控制
派生类中的成员具有不同的访问权限,包括公有成员、保护成员和私有成员。通过合理设置访问权限,可以控 制派生类的接口和数据的访问范围。
多继承和虚继承
除了单继承外,C++还支持多继承和虚继承。多继承可以让派生类从多个基 类中继承属性和方法,而虚继承可以解决多继承中的二义性问题。
1
构造函数
派生类的构造函数用于初始化派生类对
析构函数
2
象,它会首先调用基类的构造函数,然 后执行派生类自身的初始化操作。
派生类的析构函数用于释放派生类对象
所占用的资源,它会首先执行派生类自
身的清理操作,然后调用基类的析构函
数。
派生类的成员函数和成员变且可以添加 自己的新成员函数,从而实现更丰富的功能。
C++课件第十一章继承和派生类
派生类的构造函数和析构函数
1
派生类的构造函数
可以调用基类的构造函数,也可以不调用。如果不调用,编译器会自动生成一个无参构造函 数。
2
派生类的析构函数
会自动调用基类的析构函数。如果基类的析构函数是虚函数,就可以实现多态。
3
在构造函数和析构函数中,基类和派生类的对象的构造和析构顺序
先构造基类对象,再构造派生类对象。析构的顺序与构造相反。
子类从基类继承了部分接口和实 现。可以重用基类的代码,减少 代码冗余。
继承和派生类的区别
继承
子类是对基类的扩展,没有独立的意义。
公有继承
基类中的公有成员和保护成员都被子类继承, 子类对象可以直接访问。
派生
子类在基类的基础上,添加新的数据成员或成 员函数,形成新的类。
私有继承
基类中的公有成员和保护成员都被子类继承, 但在子类中不能直接访问基类的成员。
C++课件第十一章继承和 派生类
掌握继承和派生类的基本概念和应用,对于理解和设计面向对象的程序设计 有重要意义。
类的层次结构
C++类可以形成层次结构
子类可以继承基类的数据成员和 成员函数。
类的继承关系就像家族关系
基类是父亲,派生类是儿子。一 个类可以有多个子类。
建立类的层次结构有助于 程序设计的模块化
虚函数和多态性
虚函数
在基类中定义一个虚函数,在派 生类中重新定义这个函数。
运行时多态性
一个指向派生类对象的基类指针 可以调用派生类的虚函数,实现 多态。增强了代码的灵活性。
静态多态性
编译期间就决定了调用哪个函数。 如函数重载等。
抽象类和纯虚函数
抽象类
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 继承性小结
继承性提高程序代码和可重用性; 对象集中了数据与操作代码,使程序对象化后,
更易理解和维护; 注意:
注意复习理解——继承性; 继承方式不同引起的对成员的访问权限的变化,要注
意复习理解,并注重使用方法; 单重继承与多重继承,成员初始化: 语言书写格式规范、 使用方法
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
15
继承和派生
练习、设计一个圆类,从圆派生圆柱(或圆 锥),并设计成员函数输出圆柱(或圆锥) 的底面面积和体积。
完整版ppt
16
继承关系中构造函数之间的关系
• 派生类不继承基类的构造函数 • 派生类和基类的构造函数之间是一种自动调用的
关系 • 创建派生类对象时,派生类构造函数要调用基类
成员M基类中的存取权 成员M 在private继承后
限
的派生类的存取权限
public
private
protected
private
private
隐藏
完整版ppt
12
受保护继承(protected)和派生
• 基类中公有成员和受保护成员被继承后都是受 保护的
成员M基类中的存取权限 成员M 在protected继承后 的派生类的存取权限
性和行为 • 派生类可以修改继承的属性和行为 • 派生类可以增加新的属性和行为 • 派生类对象也是基类对象 • 派生类对象和基类对象可以被统一管理
完整版ppt
4
继承和派生的基本概念
基类
数据成员 函数成员
派生类
基类
数据成员 函数成员
自己的数据成员 自己的函数成员
完整版ppt
5
继承的意义
• 便于管理系统中的对象 • 系统扩充比较容易- 利用程序代码的再用性
继承和派生
继承和派生的基本概念 单一继承定义 派生类重定义基类函数 基类中成员被继承后存取权限等级的变化 继承关系中构造函数、析构函数之间的关
系 多重继承
完整版ppt
1
继承的例子
• 家具和柜子 • 建筑和房子 • 道路和高速公路 • 动物和猫 • 电视和彩色电视 • 电脑和笔记本电脑
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Teacher(nam,a,t),Student(nam,s,sco),wage(w) { }
void show( ) //输出研究生的有关数据
{cout<<″name:″<<name<<endl;
cout<<″age:″<<age<<endl;
cout<<″sex:″<<sex<<endl;
cout<<″score:″<<score<<endl;
要细致考虑其数据成员,尽量减少数据冗余。
2020/6/28
12
(3)多重继承引起的二义性问题
这些重复的数据或者同名的成员使用不当,则:会产 生的二义性(ambiguous)问题。
方法:在单继承的基础上,依次列出多个基类。
比如: 如果已声明了类A、类B和类C,可以声明多重继承的
派生类D: class D:public A, private B, protected C {类D新增加的成员}
D按不同的继承方式的规则继承A,B,C的属性,确定各 基类的成员在派生类中的访问权限。
2020/6/28
第11讲-继承与派生(2)
第11讲 继承与派生
11.2 授课要求
(1)理解多重继承的含义、定义方法和实现;
(2)理解虚基类及其作用。
2020/6/28
2
第11讲 继承与派生
11.3 授课重点 1.重点是多重继承和派生类的应用。
11.4 授课难点 1.难点是派生类的应用。
2020/6/28
3
1.多重继承
些数据。
2020/6/28
7
(2)多重继承派生类的构造函数
#include <iostream>
#include <string>
using namespace std;
class Teacher //声明类Teacher(教师)
{public:
//公用部分
Teacher(string nam,int a, string t)//构造函数
cout<<″title:″<<title<<endl;
cout<<″wages:″<<wage<<endl;
}
private: float wage;
//工资
};
12
2020/6/28
10
(2)多重继承派生类的构造函数
int main( )
{ Graduate grad1(″Wang-li″,24,′f′, ″assistant″,
string name;
int age;
string title; //职称
12
};
13
2020/6/28
8
(2)多重继承派生类的构造函数
class Student //定义类Student(学生)
{public:
Student(char nam[],char s,float sco)
{ strcpy(name1,nam);
5
(2)多重继承派生类的构造函数
多重继承派生类的构造函数形式与单继承时的构造函数形式基 本相同,只是在初始表中包含多个基类构造函数。
如:
派生类构造函数名(总参数表列) :
基类1构造函数(参数表列), 基类2构造函数(参数表列),
排列顺序任意
基类3构造函数 (参数表列)
{ 派生类中新增数成员据成员初始化语句 }
在两个基类中分别用name和name1来代表姓名,其实 这是同一个人的名字。
在两个基类中都使用同一个数据成员名name ?
可以
在show函数中引用数据成员时指明其作用域,如: cout<<″name:″<<Teacher::name<<endl;
这发现的就一数是个据唯问。一题如的:果在,有多多不重个致继基引承类时起,,二问从义题不会性同更的的突基方出类法。中。在会设继计承派一生些类重时复
89.5,1234.5);
grad1.show( ); return 0; }
程序运行结果如下: name: Wang-li age: 24
sex:f
score: 89.5
title: assistance
wages: 1234.5
11
2020/6/28
11
(2)多重继承派生类的构造函数
注意:
10
sex=s;
score=sco;
}
//构造函数
void display1( ) //输出学生有关数据
{ cout<<″name:″<<name1<<endl;
cout<<″sex:″<<sex<<endl;
cout<<″score:″<<score<<endl;
} protected: //保护部分
{ name=nam;
age=a;
title=t;} void display( ) //输出教师有关数据
{ cout<<″name:″<<name<<endl;
cout<<″age″<<age<<endl;
cout<<″title:″<<title<<endl;
} protected: //保护部分
派生类构造函数的执行顺序为: 先调用基类的构造函数,再执行派生类构造函数的函数体。调
用基类构造函数的顺序是按照声明派生类时基类出现的顺序。
2020/6/28
6
(2)多重继承派生类的构造函数
例1(P176的例5.8) 声明一个教师(Teacher)类和一个 学生(Student)类,用多重继承的方式声明一个研究 生(Graduate)派生类。 教师类中包括数据成员name(姓名)、age(年龄)、 title(职称)。 学生类中包括数据成员name1(姓名)、age(性别)、 score(成绩)。 在定义派生类对象时给出初始化的数据,然后输出这
string nLeabharlann me1;char sex;
float score; //成绩
12
};
13
2020/6/28
9
(2)多重继承派生类的构造函数
class Graduate : public Teacher,public Student
//声明多重继承的派生类Graduate
{public:
Graduate(string nam,int a,char s, string t,float sco,float w):
前面讨论了单继承,即一个类是从一个基类派生而来的。 实际上,常常有这样的情况: 一个派生类有两个或多个基类,派
生类从两个或多个基类中继承所需的属性。
多重继承:允许一个派生类同时继承多个基类。这种行 为称为多重继承(multiple inheritance)。
2020/6/28
4
(1)声明多重继承的方法