11 继承与派生
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
i A B C
f2
j
k 私有
f3
f4
m
f5
n
公用 保护 保护
公用 保护 保护 不可访问 公用 保护
私有
保护 保护 保护 不可访问 保护 保护 不可访问 公用 私有
17
5、派生类的构造函数和析构函数 、
简单的派生类的构造函数 有子对象的派生类的构造函数 多级派生时的构造函数 派生类的析构函数
18
简单的派生类的构造函数( 简单的派生类的构造函数(例11.5) )
无论是何种继承, 无论是何种继承,基类 protected成员在派生 的protected成员在派生 类中都可访问。 类中都可访问。
14
保护成员与私有成员
相同点: 相同点:
从类的用户角度看:保护成员等价于私有成员。 从类的用户角度看:保护成员等价于私有成员。
不同点: 不同点:
多级派生 — 保护成员可通过保护继承由派生类传递给下 一级派生类。 一级派生类。
7
公用继承
基类的公用成员( 基类的公用成员(public)和保护成员(protected) )和保护成员( ) 在派生类中保持原有访问属性; 在派生类中保持原有访问属性; 基类的私有成员( 基类的私有成员(private)在派生类中不可访问。 )在派生类中不可访问。
8
公用继承举例( 公用继承举例(P354) )
10
私有继承
基类的公用成员( 基类的公用成员(public)和保护成员(protected) )和保护成员( ) 在派生类中成为私有成员; 在派生类中成为私有成员; 基类的私有成员( 基类的私有成员(private)在派生类中不可访问。 )在派生类中不可访问。
11
私有继承举例( 私有继承举例(P356) )
15
基类成员在派生类中的访问属性
基类成员 private public protected
公用派生类 不可访问 public protected
私有派生类 不可访问 private private
保护派生类 不可访问 protected protected
16
多级派生时的访问属性
class A { public: int i; protected: void f2( ); int j; private: int k; }; class B: public A { public: void f3( ); protected: void f4( ); private: int m; }; class C: protected B { public: void f5( ); private: int n; };
即使是public继承, 即使是public继承,也 public继承 无法改变基类成员的私 有属性。 有属性。
9
改进
class Student { private: int num; string name; char gender; public: void Display( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 } }; class Student2: public Student { private: int age; string addr; public: void Display_2( ) { Display( ) ; cout<<“年龄 ”<<age<<endl; 年龄: 年龄 cout<<“地址 ”<<addr<<endl; 地址: 地址 } };
面向对象程序设计 面向对象程序设计
11章 第11章 继承与派生
1
本章内容
1. 继承与派生的概念 2. 派生类的声明方式 3. 派生类的构成 4. 派生类成员的访问属性 5. 派生类的构造函数和析构函数 6. 基类和派生类的转换
2
1、继承(inheritance)与派生的概念 、继承 与派生的概念
class Student { private: int num; string name; char gender; public: void Display( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 } }; class Student2: public Student { private: int age; string addr; public: void Display_2( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 cout<<“年龄 ”<<age<<endl; 年龄: 年龄 cout<<“地址 ”<<addr<<endl; 地址: 地址 } };
派生类
class Student2: public Student { private: int age; string addr;
public: void Display( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 cout<<“年龄 ”<<age<<endl; 年龄: 年龄 cout<<“地址 ”<<addr<<endl; 地址: 地址 } };
基类
class Student { private: int num; string name; char gender; public: void Display( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 } };
从基类继承来的数 据成员和成员函数, 据成员和成员函数, 可调整其访问属性。 可调整其访问属性。
派生类增加的数据 成员和成员函数
5
在派生类中覆盖基类的成员
基类
class Student { private: int num; string name; char gender; public: void Display( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 } };
class Student { public: Student(int n,string nam,char g){ num = n; name = nam; gender = s; } ~Student( ){ } protected: int num; string name; char gender ; }; class Student2: public Student { public: Student2(int n, string nam, char g, int a, string ad): Student(n, nam, g){ age = a; addr = ad; } ~Student2( ){ } private: int age; string addr; }; int main( ) { Student2 s1(10010, “Wang-li”, ‘f’, 19, “115 Beijing Road,Shanghai”); Student2 s2(10011, “Zhang-fun”, ‘m’, 21, “213 Shanghai Road,Beijing”); return 0; }
6
4、派生类成员的访问属性 、
1. 2. 3. 4. 5. 6.
Display( ) num; Display2( ) age; Display( ) age; Display_2( ) num; main ( ) Display_2( ); main ( ) Display ( );
Hale Waihona Puke Baidu
Student2 int num; string name; char gender; void Display( ) main( ) { ... } int age; string addr; void Display_2( )
class Student2: private Student { private: int age; string addr; public: void Display_2( ) { Display( ) ; cout<<“年龄 ”<<age<<endl; 年龄: 年龄 cout<<“地址 ”<<addr<<endl; 地址: 地址 } }; int main( ) { Student s1; Student2 s2; s1.Display( ); s2.Display_2( ); s2.Display( ); return 0; } //√ //√ //×
继承方式: 继承方式:private, public, protected
4
3、派生类的构成 、
Student int num; string name; char gender; void Display( )
Student2 int num; string name; char gender; void Display( ) int age; string addr; void Display_2( )
13
保护成员和保护继承举例
class Student { protected: int num; string name; char gender; public: void Display( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 } }; class Student2: protected Student { private: int age; string addr; public: void Display_2( ) { cout<<“学号 ”<<num<<endl; 学号: 学号 cout<<“姓名 ”<<name<<endl; 姓名: 姓名 cout<<“性别 ”<<gender<<endl; 性别: 性别 cout<<“年龄 ”<<age<<endl; 年龄: 年龄 cout<<“地址 ”<<addr<<endl; 地址: 地址 } };
19
有子对象的派生类的构造函数( 有子对象的派生类的构造函数(例11.6) )
继承:在一个已存在的类的基础上建立一个新类。 继承:在一个已存在的类的基础上建立一个新类。
父类(father class)” “基类(base class)” 或 “父类 基类 “派生类 派生类(derived class)” 或“子类 子类(child class)” 派生类
3
2、派生类的声明方式 、
12
保护成员和保护继承
基类的公用成员( 基类的公用成员(public)和保护成员(protected) )和保护成员( ) 在派生类中成为保护成员 保护成员; 在派生类中成为保护成员; 基类的私有成员( 基类的私有成员(private)在派生类中不可访问。 )在派生类中不可访问。
不能被类外引用, 不能被类外引用,但能 被派生类的成员引用。 被派生类的成员引用。
派生类
class Student2: public Student { private: int age; string addr;
public: void Display_2( ) { cout<<“年龄 ”<<age<<endl; 年龄: 年龄 cout<<“地址 ”<<addr<<endl; 地址: 地址 } };