第7章 继承性和派生类

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);}

相关文档
最新文档