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”的成员,然后引用是就会懵逼,程序会无法分辨你所需要引用的究竟是哪一个。故而我们在写程序是就要注意这一点,避免出现二义性。

  值得一提的是,同名不同数据的成员会引发二义性,同名且数据相同的成员也会引发二义性。

 

四、多层继承

   派生类继承基类,而继承后的派生类又可以作为一个新的基类被另外的派生类所继承。这样层层叠叠下去的形式我们称之为多层继承,又或者说是多级派生。

  多层继承比较简单,没有什么特殊的东西,主要是运用好上面所说的继承的方式。之所以说私有继承在实际上运用的不是很多,便是因为私有继承的派生类是无法再向下继承的,私有成员仅仅是为了保护积累中的私有数据而存在的。

 

五、虚基类

  上面再多重继承的时候提到过多重继承引发的二义性问题,而虚基类的存在便是为了避免二义性所出现的方法。

  虚基类的作用为——在继承间接共同基类时只保留一份成员。意思是指在多重继承的多个基类中有同样(名字和数据相同)的成员时只保留一份。

  虚基类的设定可以有效避免同样二义性,但是,在不同数据时还是会导致程序出现问题,所以在不同的数据上最好还是要进行差别对待。

 

posted @ 2020-10-18 18:50  勤劳小虾米  阅读(291)  评论(0)    收藏  举报