第7章 继承性和派生类
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第7章继承性和派生类
本章内容:基类和派生类、单继承、多继承、虚基类。
类
面向对象系统三要素对象
继承
封装性基础面向对象系统三特征继承性关键
多态性补充
继承是面向对象程序设计中软件重用的关键技术。继承机制使用已经定义的类作为基础建立新的类定义,新的类是原有类的数据﹑操作和新类所增加的数据﹑操作的组合。
新的类把原有类作为基类引用,而不需要修改原有类的定义。新定义的类作为派生类引用。这种可扩充﹑可重用技术大大降低了大型软件的开发难度和维护费用。
7.1 基类和派生类
我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。
在C++语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。
单继承 多继承 7.1.1派生类的定义格式 单继承的定义格式:
class 派生类名:继承方式 基类名 {
派生类新定义成员 };
public 表示公有继承 继承方式 private 表示私有继承
protected 表示保护继承
继承方式规定了如何访问从基类继承的成员。继承方式却省,隐含私有继承。
多继承的定义格式如下:
class 派生类名:继承方式1 基类名1,
继承方式2 基类名2,…
{
派生类新定义成员
};
7.1.2 派生类的三种继承方式
1.公有继承(public)
公有成员是类的接口,在类中和类外可见。
特点:基类的公有和保护成员的访问属性在派生类中不变、而基类的私有成员不可访问。
基类成员
派生类新定义成员成员
派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。
2.私有继承(private)
私有成员只能在类中可见,不能再类外或派生类中使用。
特点:基类中的公有成员和保护成员都以私有成员身份出现在派生类中,而基类的私有成员在派生类中不可访问。
基类成员
派生类
新定义成员成员
派生类的成员函数可以访问基类中的公有成员和保护成员。而无法再往下继承。
3.保护继承(protected)
保护成员在类中和它的派生类中可见。
特点:基类的公有和保护成员都以保护成员的身份出现在派生类中,并且只能被它的派生类成员函数或友元函数访问,而基类的私有成员不可访问。
基类成员 派生类 新定义成员 成员
派生类的成员函数可以访问基类中的公有成员和保护成员。
三种不同的继承方式的基类和派生类特性。
7.1.3 基类与派生类的关系
在这个层次结构中,由上到下,是一个具体化、特殊化的过程;由下到上,是一个抽象化的过程。最高层抽象程度最高,从上到下加入了自己的新特征,而最下层是最为具体的。
在派生过程中,派生出来的新类也同样可以作为基类再继续派生新的类。直接参与派生出某类的基类称为直接基类。基类的基类称为间接基类,比如A类派生出
B类,B类又派生出C类。则B类是C类的直接基类,A 类是B类的直接基类。而A类可以称为C类的间接基类。
7.2 单继承
7.2.1 成员访问权限的控制
例7.1
#include
class A
{ public:
void f1( );
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( );
};
问题:
1.派生类B中f2( )能否访问基类A中:f1( ),j1,i1?
2.派生类B中b1能否访问基类A中:f1( ),j1,i1?
3.派生类C中f3( )能否访问直接基类B中:f2( ),j2,i2?能否访问间接基类A中:f1( ),j1,i1?
4.派生类C中对象c3能否访问直接基类B中:f2( ), j2,i2?能否访问间接基类A中:f1( ),j1,i1?
例 7.2
#include
class A
{ public:
void f(int i){cout<
void g( ){cout<<”g\n”;} };
class B:A
{ public:
void h( ){cout<<”h\n”;}
A::f;
};
void main( )
{ B d1;
d1.f(6);
d1.g( );
d1.h( );
}
问题:
1.d1.g( );出现编译错。
2.去掉d1.g( );执行结果为:
6
h
3. A::f;将基类中的公有成员说明成派生类的公有成员。
4.将私有继承改为公有继承输出为:
6
g
h
例 7.3
#include
#include
class A
{ public:
A(const char *nm){ strcpy(name,nm);}