C/C++知识点之C++继承
小标 2019-01-21 来源 : 阅读 1470 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C++继承,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C++继承,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

C/C++知识点之C++继承

继承(inheritance)是面向对象的主要特征(此外还有封装和多态)之一,它使得一个类可以从现有类中派生,而不必重新定义一个新类。继承的实质就是用已有的数据类型创建新的数据类型,并保留己有数据类型的特点,以旧类为基础创建新类,新类包含了旧类的数据成员和成员函数,并且可以在新类中添加新的数据成员和成员函数。旧类被称为基类或父类,新类被称为派生类或子类。

  继承也是C十+语言中类机制的一部分,该机制使类与类之间可以建立一种上下级关系。可以通过提供来自另一个类的操作和数据成员来创建新类,程序员只需在新类中定义己有类中没有的成分即可建立新类。这是继数据封装和信息隐藏性质的类的抽象性编程的又一杰作。有了继承,过去的代码就可以不被丢弃,只要经过稍加修改就可重用。人类从低级社会向高级社会发展,其文明程度和获得的知识都在增长,事实上,事物的发展总是一个从低级到高级的发展过程。类的继承就是反映了原始的简单代码慢慢发展到丰富的高级代码的过程。程序越来越完善,功能越来越强,人们不是通过外在的代码复制和保存,而是通过语言内在的继承功能,自动地、滚动式地重用代码,增强代码,使得编程的方法开始根本改变,分析问题和解决问题的模式从功能模式转向对象结构模式。
  派生类总是依附于基类,派生类对象中总是含有基类对象,即含有基类的数据成员。或者说,基类对象是派生类对象的组成部分。至于在具体的实现中空间的安排,并不一定基类排在前,派生类排在后。显然,派生类对象一定不会比基类对象小,基类也称超类,派生类也称子类,它保存了更多的数据,提供了更多的操作。
1.类的继承类继承的形式如下:
class派生类名标识符:[继承方式]基类名标识符{[访问控制修饰符:][成员声明列表]};
继承方式有3种派生类型,分别为公有型(public )、保护型(protected)和私有型(private);访问控制修饰符也是public,protected,private 3种类型;成员声明列表中包含类的成员变量及成员函数,是派生类新增的成员。":"是一个运算符,表示基类和派生类的继承关系。
 
公有继承,反映了派生类对基类使用方式的全部接受,在此基础上进行扩充,以便能被外界更广泛地使用。因此,通过派生类对象,仍然可以使用基类中原来公有的操作。派生类获得了所有基类成员原封不动的访问控制权限的继承。继承了基类,并不是说派生类就能访问基类的私有成员了。如果是那样的话,那些使用基类的人,靠派生就能达到访问基类私有成员的变态目的了。
在类中,还有一种保护(protected )型的访问控制符,保护成员与私有成员一样,不能被使用类的程序员进行公共访问,但可以被类内部的成员函数访问。除此之外用的类是派生类成员,则可以被访问,这是私有成员所不具有的能力。也就是说如果使只要将类成员声明为保护成员,则其派生类在继承之后,就可以坐享其父类的公有和保护操作了。
2.继承后可访问性
继承方式有public, private, protected 3种,其说明如下:
public(共有型派生)共有型派生表示对于基类中的public数据成员和成员函数,在派生类中仍然是public,对于基类中的private数据成员和成员函数,在派生类中仍然是private。
private(私有型派生)    私有型派生表示对于基类中的public, protected数据成员和成员函数,在派生类中可以访问。基类中的private数据成员,在派生类中不可以访问。
protected(保护型派生)    保护型派生表示对于基类中的public, protected数据成员和成员函数,在派生类中均为protected。protected类型在派生类定义时可以访问,用派生类声明的对象不可以访问,也就是说在类体外不可以访问。protected成员可以被基类的所有派生类使用。这一性质可以沿继承树无限向下传播。
因为保护类的内部数据不能被随意更改,实例类本身负责维护,这就起到很好的封装性作用。把一个类分作两部分,一部分是公共的,另一部分是保护的,保护成员对于使用者来说是不可见的,也是不需了解的,这就减少了类与其他代码的关联程度。类的功能是独立的,它不依赖于应用程序的运行环境,既可以放到这个程序中使用,也可以放到那个程序中使用。这就能够非常容易地用一个类替换另一个类。类访问限制的保护机制使人们编制的应用程序更加可靠和易维护。
3.派生类的构造
派生类也是类,如果没有定义构造函数,则根据类机制,将会执行默认的无参构造函数。派生类的默认无参构造函数会首先调用父类的无参构造函数,如果父类定义了有参构造函数(因此没有默认无参构造函数),又没有重载定义无参构造函数,则会导致编译发怒。如果父类还有父类,则父类会先调用父类的父类的无参构造函数,以此递归。
在构造一个子类时,完成其基类部分的构造由基类的构造函数去做,将基类对象看作是完全独立于派生类的对象。这样做的好处是,一旦基类的实现有错误,只要不涉及界面,那么,基类实现中的修改不会影响派生类的操作。类与类之间,你做你的,我做我的,职责分明,即使有父子继承关系的类之间也不例外。
由于父类和子类中都有构造函数和析构函数,当从父类派生一个子类并声明一个子类的对象时,它将先调用父类的构造函数,然后调用当前类的构造函数来创建对象;在释放子类对象时,先调用的是当前类的析构函数,然后是父类的析构函数。
在分析完对象的构建、释放过程后,会考虑这样一种情况:定义一个基类类型的指针,调用子类的构造函数为其构建对象,当对象释放时,是直接调用父类的析构函数还是先调用子类的析构函数,再调用父类的析构函数呢?答案是如果析构函数是虚函数,则先调用子类的析构函数,然后再调用父类的析构函数;如果析构函数不是虚函数,则只调用父类的析构函数。可以想象,如果在子类中为某个数据成员在堆中分配了空间,父类中的析构函数不是虚成员函数,将使子类的析构函数不被调用,其结果是对象不能被正确地释放,导致内存泄漏的产生。因此,在编写类的析构函数时,析构函数通常是虚函数。构造函数调用顺序不受基类在成员初始化表中是否存在以及被列出的顺序的影响。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程