继承和派生

来源:互联网 发布:永恒之塔5.0人物数据 编辑:程序博客网 时间:2024/06/02 02:05

类的数据,成员函数都是抽象的,必须定义相应的对象,由对象名才能访问。不能直接访问。

在C++中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类(baseclass)”或“父类(father class)”。新建立的类称为“派生类(derived class)”或“子类(son class)”。

一个类中包含了若干数据成员和成员函数。在不同的类中,数据成员和成员函数是不相同的。但有时两个类的内容基本相同或有一部分相同。利用原来声明的类Student作为基础,再加上新的内容即可,以减少重复的工作量。 C++提供的继承机制就是为了解决这个问题。

从基类接收成员。派生类把基类全部的成员(不包括构造函数和析构函数)接收过来,也就是说是没有选择的,不能选择接收其中一部分成员,而舍弃另一部分成员。

声明派生类的一般形式为:

class 派生类名: [继承方式] 基类名

{

派生类新增加的成员

} ;

继承方式包括:

 public(公用的),private(私有的)和protected(受保护的),此项是可选的,不同的继承方式决定了基类成员在派生类中的访问属性。

(1)公用继承(public inheritance)

基类的公用成员和保护成员在派生类中保持原有访问属性。其私有成员仍为基类私有,派生类不能直接访问,只能通过基类的公有接口访问基类的私有成员。

(2)私有继承(private inheritance)

基类的公用成员和保护成员在派生类中成了私有成员(意思是在派生出的这个新类中相对于外界来说是私有的),即派生类的成员函数能访问他们,而在派生类外不能访问他们。其私有成员仍为基类私有。

(3)受保护的继承(protected inheritance)

基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。

保护成员的意思是: 不能被外界引用,但可以被派生类的成员引用,

无论怎么继承,一个类的私有成员,只有该类能够访问。

无论哪一种继承方式,在派生类中是不能访问基类的私有成员的,私有成员只能被本类的成员函数所访问,毕竟派生类与基类不是同一个类。如果在多级派生时都采用公用继承方式,那么直到最后一级派生类都能访问基类的公用成员和保护成员。如果采用私有继承方式,经过若干次派生之后,基类的所有的成员已经变成不可访问的了。如果采用保护继承方式,在派生类外是无法访问派生类中的任何成员的。而且经过多次派生后,人们很难清楚地记住哪些成员可以访问,哪些成员不能访问,很容易出错。因此,在实际中,常用的是公用继承。

多层派生时可先把上层派生的类看作基类即可。


多重继承

C++允许一个派生类同时继承多个基类。这种行为称为多重继承。

如果已声明了类A、类B和类C,可以声明多重继承

的派生类D:

class D:public A,private B,protected C

{类D新增加的成员}

多重继承最常见的问题就是继承的成员同名而产生的二义性(ambiguous)问题。

同名的数据和成员可以用基类名来限定。

如果在定义派生类对象的模块中通过对象名访问同名的成员,则访问的是派生类的成员。注意: 不同的成员函数,只有在函数名和参数个数相同、类型相匹配的情况下才发生同名覆盖,如果只有函数名相同而参数不同,不会发生同名覆盖,而属于函数重载。(此处的覆盖不是有一个没有了,而是可能访问不了)

 

虚基类

如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员。在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避免产生二义性,使其惟一地标识一个成员。

C++提供虚基类(virtual baseclass)的方法,使得在继承间接共同基类时只保留一份成员。

声明虚基类的一般形式为:

class 派生类名: virtual 继承方式 基类名

许多专业人员认为:不要提倡在程序中使用多重继承,只有在比较简单和不易出现二义性的情况或实在必要时才使用多重继承,能用单一继承解决的问题就不要使用多重继承。

 

组合

在一个类中以另一个类的对象作为数据成员的,称为类的组合(composition)。

例如:教师有生日的属性,但不能说教师是生日。(通过继承建立了派生类与基类的关系,他是一种“是”的关系。组合是“有”的关系

0 0
原创粉丝点击