C++ 多态之继承1-简介

接触c/c++已经有3个念头了,偏向c,所以在c++方面,自我评价是半吊子,只会使用它的一些基本功能。最近比较闲,所以就重新学习了c++,学习期间有一些自己的感触,所以想分享给大家,准备从c++比较难的继承开始写起。

C++提供了两种主要的方式来构建一个功能复杂的类:组合和继承,组合主要是通过结合其他功能对象来创建新的对象,使新对象具有更丰富的功能;而继承则是创建一个新对象,该新对象通过直接获取其他对象的属性以及行为,然后通过扩展或者定制来实现新对象的丰富功能。和组合一样,在现实生活中继承无处不在,你会继承你的父母的基因,并且获得他们的一些特性(俗话说就是长得像爸妈)。C++继承了许多c的特性,c语言也从在它之前诞生的语言那里继承了一些特性。

想一下苹果和香蕉,虽然它们是不同的水果,但共性是都是水果。任何关于水果的事实对于苹果和香蕉而言也是事实。例如,所有的水果都有名字,口味,切实的个体。因此,苹果和香蕉也有名字,口味以及切实的个体。苹果和香蕉从水果那里继承了这些属性,但是也以不同的方式定义了这些属性(例如口味不同),这些不同的方式可以用于同其他

的水果。

我们将被继承的对象称之为parent(父类)或者base(基类),将继承对象称之为child(子类)或者derived(派生类)。如上面的图,fruit是父,apple和banana是子。不像组合,每个对象和其子对象都有一种“has-a”关系(组合),而对于继承,每个子都与父有一种“is-a”关系(专门化)。

默认情况下,子会拥有父的属性。然而,子又能够自由的定义或者重新定义继承的属性(香蕉有其独一无二的味道),添加新属性(香蕉有浆糊状的属性),或者是隐藏属性。

C++为何需要继承呢?

面向对象编程语言的一个基本理念就是代码复用。然而,存在的代码往往无法严格的执行需求。例如,我们有一个三角形,但是需要一个正方形,,这种情况下,我们可以准备很多选择去处理这个问题,每种选择有自己的有点和缺点。

或许最显而易见的方法就是改变已经存在的代码来满足我们的需求。然而,如果我们这样做,我们将不再能用使用它的原始用途,所以这算不上一个好点子。

一个稍微好点的办法就是复制一些或者所有的代码然后更改来满足需求。然而这有一些缺点。首先,尽管复制黏贴看似很简单,但这实际上是很危险的。一个单一的忽略能导致程序错误的工作,这可能需要花费数天来查找在一个复杂的项目中。重命名一个类,然后搜索和替换也是很危险的(不小心替换了一些不是你本意的东西)。第二点,重写代码来实现需求,这需要非常了解功能(精通),然而在一个复杂的项目中,做到这点很难。第三点,并且或许是最相关的,这通常涉及到对现有功能的重复,这将导致维护问题。改进或者bug修复需要被加入到功能的不同副本中,但实际上都是做的同样的事,这很浪费程序员的时间。如果程序员不记得某些副本,可能是这些副本得不到相应的改进和bug修复。

继承能以有效的方式来解决大部分上述的问题。取代手动复制和修改代码,继承允许你直接使用现有的代码来满足需求。你只需要添加新的属性,重定义那些不满足需求的已有属性,或者隐藏一些你不想要的属性。这样显然更高效和安全。此外,基类中的任何修改自动的传递到子类中,这意味着或许只需要一个小的改动(bug修复),所有的派生对象就能自动的更新。

继承确实也有几个潜在的不利因素,后面将会提到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值