C++核心之——“继承性”
在编写程序的过程中,其实很多地方都是在对过往程序的附加。使用C++的继承,我们就可以省略很多的时间和精力,毕竟时间宝贵,我们不应该花费太多时间去进行这一类重复的机械化书写。
而C++中便是通过继承来实现程序的“可重用性”,故而C++中的“继承性”在C++中的占比极高。
一、简述C++的继承
中文有一大好处就是翻译的时候回尽可能的翻译的简单明了,往往能够见字而知其意。而这“继承”二字,则是更加的直白。所谓的“继承”便是被继承者将自己的财产等等全数交付于继承者,而在C++中被继承者称之为“基类”或“父类”,继承者称之为“派生类”或“子类”。
一个新类从另一个已有的类(这个已有的类便是“基类”,那个新类便是“派生类”)中获得其特性,这种现象便是所谓的——类的继承,亦或者欢迎角度说就是——类的派生。
二、继承方式
为了主动控制继承的类,我们将类中的成员划分为三种,分别是“公用成员”、“保护成员”以及“私有成员”。而对应的,我们也有“公用继承”、“保护继承”以及“私有继承”。
1、公用继承
|
在基类中的属性 |
继承方式 |
在派生类中的属性 |
|
公用成员(public) |
公用继承(public) |
公用成员(public) |
|
保护成员(protected) |
公用继承(public) |
保护成员(p[rotected) |
|
私有成员(private) |
公用继承(public) |
不可访问 |
公用继承非常的好理解,就是原原本本的将基类的东西继承过来,基类中是什么属性,在派生类中还是什么属性(私有成员除外)。
为什么私有成员继承过去后不是私有成员而是不可访问?这是C++中对于私有数据的保护,实际上私有成员其实已经继承过去了,但是却不给访问权限,不可访问。
2、私有继承
|
在基类中的属性 |
继承方式 |
在派生类中的属性 |
|
公用成员(public) |
私有继承(private) |
私有成员(private) |
|
保护成员(protected) |
私有继承(private) |
私有成员(private) |
|
私有成员(private) |
私有继承(private) |
不可访问 |
可以发现,私有继承的公用成员和保护成员继承过去后会变成私有成员的,这个私有成员在外部无法访问,但是在内部还是可以访问的。但是基类的私有成员在派生类中却是无法访问的。 故而私有继承后的派生类无法再次继承。
正是因为私有继承的诸多限制,在编写程序的过程中,一般很少会用到私有继承的方式
3、保护继承
在说保护继承前,先要说一下保护成员(protected)。什么是保护成员?保护成员顾名思义就是“受保护的成员”,保护成员是不能在类外访问的,可以认为保护成员对于类的用户而言是私有的。从类的用户的角度来说,保护成员和私有成员等价。但是,二者的区别在于,私有成员继承过后完全无法访问,无论是在类中还是类外,但是保护成员在继承后却是可以在类中进行访问的。
|
在基类中的属性 |
继承方式 |
在派生类中的属性 |
|
公用成员(public) |
保护继承(protecked) |
保护成员(protecked) |
|
保护成员(protecked) |
保护继承(protecked) |
保护成员(protecked) |
|
私有成员(private) |
保护继承(protecked) |
不可访问 |
可以看见,保护继承后,基类中的公用成员也成为了保护成员,相当于是说将基类的公用成员也一并保护了起来,使其不让类外任意访问,这一部分,保护成员和私有成员是一样的,而二者的区别在于,基类的保护成员可以在派生类和基类中引用,而私有成员只可以在基类中引用。
三、多重继承
多重继承是编程是能够经常遇到的事情,即“派生类”同时拥有多个“基类”。
多重继承可以继承多个基类成员的特性,但是要注意的一点是——不要引发二义性。假如基类一和基类二中都有一个成员为“name”,那么派生类在继承后就会有了两个名为“name”的成员,然后引用是就会懵逼,程序会无法分辨你所需要引用的究竟是哪一个。故而我们在写程序是就要注意这一点,避免出现二义性。
值得一提的是,同名不同数据的成员会引发二义性,同名且数据相同的成员也会引发二义性。
四、多层继承
派生类继承基类,而继承后的派生类又可以作为一个新的基类被另外的派生类所继承。这样层层叠叠下去的形式我们称之为多层继承,又或者说是多级派生。
多层继承比较简单,没有什么特殊的东西,主要是运用好上面所说的继承的方式。之所以说私有继承在实际上运用的不是很多,便是因为私有继承的派生类是无法再向下继承的,私有成员仅仅是为了保护积累中的私有数据而存在的。
五、虚基类
上面再多重继承的时候提到过多重继承引发的二义性问题,而虚基类的存在便是为了避免二义性所出现的方法。
虚基类的作用为——在继承间接共同基类时只保留一份成员。意思是指在多重继承的多个基类中有同样(名字和数据相同)的成员时只保留一份。
虚基类的设定可以有效避免同样二义性,但是,在不同数据时还是会导致程序出现问题,所以在不同的数据上最好还是要进行差别对待。

浙公网安备 33010602011771号