第七章 继承性与派生类
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1 派生类的定义格式
单继承的定义格式如下: Class <派生类名> : <继承方式> <基类名>
{ <派生类型定义成员>
}; 多继承的定义格式如下:
Class <派生类名> : <继承方式1> <基类名1>, <继承方式2> <基类名 2>,……
{ <派生类新定义成员>
}; <继承方式>常使用如下三种关键字给予表示: public 表示公有继承 private 表示私有继承 protected 表示保护继承
– 基类保护成员相当于派生类的保护成员,即派生 类可以象访问自身的保护成员一样,访问基类的 保护成员。
– 对于基类的私有成员,派生类内部成员无法直接 访问。派生类使用者也无法通过派生类对象直接 访问。
[例] 分析程序中的访问权限
#include <iostream.h> class A {
public: void f 1( );
protected : 对派生类的成员来说,是共有的;其余为私有。
1.3 基类和派生类的关系
任何一个类都可以派生出一个新类,派生 类也可以再派生出新类 类A是类C的间接基类, 类B是类A的直接派生类
基类与派生类之间的关系:可复用的软件构件 派生类是基类的具体化 派生类是基类定义的延续 派生类是基类的组合
果如何? 3. 程序中派生类B是从基类A继承来的,这
种缺省继承方式是哪种继承方式? 4. 派生类B中,A::f的含义是什么? 5. 将派生类B的继承改为公有继承方式该
程序输出什么结果?
Ans:
1 d1.g( );语句出现编译错误,因为B是以私有继承 方式继承类A的,所以B类的对象不可访问A类的成 员函数。
protected: int j1;
private: int i1;
};
class B::public A {
public: void f2( );
protected: int j2;
private: int i2;
}; class C:public B {
public: void f3( );
};
系统的默认值是私有继承(private)。
不同继承方式的基类和派生类特性
类成员 对象 public 对象 protected 对象 private 对象
类型
继承类
继承类
继承类
priv X
X
X
X
X
X
X
prote X prote X
prote X
priv X
pub V pub
V
prote X
priv X
2 d1.g( );语句注释后,执行该程序输出以下结果: 6 h
3 使用class关键字定义类时,缺省的继承方式是 private。
4 A::f;是将基类中的公有成员说明为派生类的公有 成员。
5 将class B:A改为class B:public A以后,输出如下: 6 g h
保护继承(public)
派生类C的对象c1能否访问直接基类B中的成 员:f2( )和j2呢?能否访问间接基类A中的 成员:f1( ), i1和j1呢?
从对(1)~(4)问题的回答可得出什么结论?
Ans:
1. 可以访问f1( )和j1,而不可以访问i1。 2. 可以访问f1( ),而不可以访问j1和i1。 3. 可以访问直接基类中的f2( )和j2以及
间接基类中的f1( )和j1,而不可以访问 i2和i1。 4. 可以访问直接基类中的f2( )和间接基 类中的f1( ),其它的都不可以访问。 5. 在公有继承时,派生类的成员函数可访 问基类中的公有成员和保护成员;派生 类的对象仅可访问基类中的公有成员。
Βιβλιοθήκη Baidu
私有继承 (private)
派生类对基类各种成员访问权限如下 :
– 基类公有成员和保护成员都相当于派生类 的私有成员,派生类只能通过自身的函数 成员访问他们
– 对于基类的私有成员,无论派生类内部成 员或派生类使用者都无法直接访问。
[例]分析程序,回答问题
#include <iostream.h> class A {
public: void f(int i){cout << i << endl:} void g( ) {cout << "g\n";}
回答下列问题:
派生类B中成员函数f2( )能否访问基类A中 的成员:f1( ), i1 和 j1呢?
派生类B的对象b1能否访问基类A中的成员: f1( ), i1 和 j1呢?
派生类C中成员函数f3( )能否访问直接基类 B中的成员:f2( )和j2呢?能否访问间接基 类A中的成员:f1( ), i1 和 j1 呢?
}; class B:A {
public: void h( ) {cout << "h\n";} A::f;
};
void main( ) {
B d1; d1.f(6); d1.g( ); d1.h( ); }
回答下列问题: 1. 执行该程序时,哪个语句会出现编译错?
为什么? 2. 去掉出错语句后,执行该程序后输出结
2 单继承
每一个类可以有多个派生类 每一个派生类只能有一个基类从而形成 树形结构
2.1 成员访问权限的控制
公有继承public
私有继承private
保护继承protected
公有继承(public)
公有继承方式创建的派生类对基类各种成 员访问权限如下 :
– 基类公有成员相当于派生类的公有成员,即派生 类可以象访问自身公有成员一样访问从基类继承 的公有成员。
1.2 派生类的三种继承方式
公有继承(public) 基类的公有成员和保护成员作为派生类的成员时,它们都 保持原有的状态,而基类的私有成员仍然是私有的
私有继承(private) 基类的公有成员和保护成员都作为派生类的私有成员,并 且不能被这个派生类的子类所访问
保护继承(protected) 基类的所有公有成员和保护成员都作为派生类的保护成员, 并且只能被它的派生类成员函数或友元访问,基类的私有 成员仍然是私有的
保护继承方式创建的派生类对基类各种成 员访问权限如下 :
– 基类的公有成员和保护成员都相当于派生 类的保护成员,派生类可以通过自身的成 员函数或其子类的成员函数访问他们
– 对于基类的私有成员,无论派生类内部成 员或派生类使用者都无法直接访问
[例] 分析程序,回答问题
单继承的定义格式如下: Class <派生类名> : <继承方式> <基类名>
{ <派生类型定义成员>
}; 多继承的定义格式如下:
Class <派生类名> : <继承方式1> <基类名1>, <继承方式2> <基类名 2>,……
{ <派生类新定义成员>
}; <继承方式>常使用如下三种关键字给予表示: public 表示公有继承 private 表示私有继承 protected 表示保护继承
– 基类保护成员相当于派生类的保护成员,即派生 类可以象访问自身的保护成员一样,访问基类的 保护成员。
– 对于基类的私有成员,派生类内部成员无法直接 访问。派生类使用者也无法通过派生类对象直接 访问。
[例] 分析程序中的访问权限
#include <iostream.h> class A {
public: void f 1( );
protected : 对派生类的成员来说,是共有的;其余为私有。
1.3 基类和派生类的关系
任何一个类都可以派生出一个新类,派生 类也可以再派生出新类 类A是类C的间接基类, 类B是类A的直接派生类
基类与派生类之间的关系:可复用的软件构件 派生类是基类的具体化 派生类是基类定义的延续 派生类是基类的组合
果如何? 3. 程序中派生类B是从基类A继承来的,这
种缺省继承方式是哪种继承方式? 4. 派生类B中,A::f的含义是什么? 5. 将派生类B的继承改为公有继承方式该
程序输出什么结果?
Ans:
1 d1.g( );语句出现编译错误,因为B是以私有继承 方式继承类A的,所以B类的对象不可访问A类的成 员函数。
protected: int j1;
private: int i1;
};
class B::public A {
public: void f2( );
protected: int j2;
private: int i2;
}; class C:public B {
public: void f3( );
};
系统的默认值是私有继承(private)。
不同继承方式的基类和派生类特性
类成员 对象 public 对象 protected 对象 private 对象
类型
继承类
继承类
继承类
priv X
X
X
X
X
X
X
prote X prote X
prote X
priv X
pub V pub
V
prote X
priv X
2 d1.g( );语句注释后,执行该程序输出以下结果: 6 h
3 使用class关键字定义类时,缺省的继承方式是 private。
4 A::f;是将基类中的公有成员说明为派生类的公有 成员。
5 将class B:A改为class B:public A以后,输出如下: 6 g h
保护继承(public)
派生类C的对象c1能否访问直接基类B中的成 员:f2( )和j2呢?能否访问间接基类A中的 成员:f1( ), i1和j1呢?
从对(1)~(4)问题的回答可得出什么结论?
Ans:
1. 可以访问f1( )和j1,而不可以访问i1。 2. 可以访问f1( ),而不可以访问j1和i1。 3. 可以访问直接基类中的f2( )和j2以及
间接基类中的f1( )和j1,而不可以访问 i2和i1。 4. 可以访问直接基类中的f2( )和间接基 类中的f1( ),其它的都不可以访问。 5. 在公有继承时,派生类的成员函数可访 问基类中的公有成员和保护成员;派生 类的对象仅可访问基类中的公有成员。
Βιβλιοθήκη Baidu
私有继承 (private)
派生类对基类各种成员访问权限如下 :
– 基类公有成员和保护成员都相当于派生类 的私有成员,派生类只能通过自身的函数 成员访问他们
– 对于基类的私有成员,无论派生类内部成 员或派生类使用者都无法直接访问。
[例]分析程序,回答问题
#include <iostream.h> class A {
public: void f(int i){cout << i << endl:} void g( ) {cout << "g\n";}
回答下列问题:
派生类B中成员函数f2( )能否访问基类A中 的成员:f1( ), i1 和 j1呢?
派生类B的对象b1能否访问基类A中的成员: f1( ), i1 和 j1呢?
派生类C中成员函数f3( )能否访问直接基类 B中的成员:f2( )和j2呢?能否访问间接基 类A中的成员:f1( ), i1 和 j1 呢?
}; class B:A {
public: void h( ) {cout << "h\n";} A::f;
};
void main( ) {
B d1; d1.f(6); d1.g( ); d1.h( ); }
回答下列问题: 1. 执行该程序时,哪个语句会出现编译错?
为什么? 2. 去掉出错语句后,执行该程序后输出结
2 单继承
每一个类可以有多个派生类 每一个派生类只能有一个基类从而形成 树形结构
2.1 成员访问权限的控制
公有继承public
私有继承private
保护继承protected
公有继承(public)
公有继承方式创建的派生类对基类各种成 员访问权限如下 :
– 基类公有成员相当于派生类的公有成员,即派生 类可以象访问自身公有成员一样访问从基类继承 的公有成员。
1.2 派生类的三种继承方式
公有继承(public) 基类的公有成员和保护成员作为派生类的成员时,它们都 保持原有的状态,而基类的私有成员仍然是私有的
私有继承(private) 基类的公有成员和保护成员都作为派生类的私有成员,并 且不能被这个派生类的子类所访问
保护继承(protected) 基类的所有公有成员和保护成员都作为派生类的保护成员, 并且只能被它的派生类成员函数或友元访问,基类的私有 成员仍然是私有的
保护继承方式创建的派生类对基类各种成 员访问权限如下 :
– 基类的公有成员和保护成员都相当于派生 类的保护成员,派生类可以通过自身的成 员函数或其子类的成员函数访问他们
– 对于基类的私有成员,无论派生类内部成 员或派生类使用者都无法直接访问
[例] 分析程序,回答问题