科百科
当前位置: 首页 范文大全

c语言继承与派生(C简单理解private继承及其应用场合)

时间:2023-06-30 作者: 小编 阅读量: 3 栏目名: 范文大全

派生类新成员的加入是继承与派生机制的核心,是保证派生类在功能上有所发展的关键。可以根据实际情况的需要给派生类添加适当的数据和函数成员,来实现必要的新增功能。protected访问属性对于派生类来说相当于是public,是透明的,对于外部函数来说相当于private,是封闭的。其意义在于私有继承可以帮助我们复用基类代码,并防止基类接口的曝光。private继承意味着派生类只想获取并适当加工基类的某些函数实现。

基类派生新类的过程包括三个步骤:吸收基类成员、改造基类成员和添加新的成员。C类继承中,派生类包含了它所有基类的除构造、析构函数之外的所有成员。对基类成员的改造包括两个方面,第一个是基类成员的访问控制问题,依靠派生类定义时的继承方式来控制。第二个是对基类数据或函数成员的覆盖,对基类的功能进行改造。派生类新成员的加入是继承与派生机制的核心,是保证派生类在功能上有所发展的关键。可以根据实际情况的需要给派生类添加适当的数据和函数成员,来实现必要的新增功能。同时,在派生过程中,基类的构造函数和析构函数是不能被继承下来的,一些特别的初始化和扫尾清理工作,需要加入新的构造和析构函数。

对于类成员的三类访问属性,及三种继承方式形成的派生类继承父类变更后的访问属性,这些访问属性的访问控制需要站在不同的使用主体去理解,这些使用主体可以分为4类:

在于protected访问属性和protected继承,除了需要分4类访问主体以外,还要区分三个继承层次。

protected访问属性对于派生类来说相当于是public,是透明的,对于外部函数来说相当于private,是封闭的。

最难理解的就是私有继承了,为什么会有这种方式,继承过来后,public和protected部分都成了私有属性,外界不能访问?这有什么意义?不要忘了,虽然派生类的对象不能访问基类中的任何的成员,但该继承层次的成员函数是可以访问的。其意义在于私有继承可以帮助我们复用基类代码,并防止基类接口的曝光。

#include <iostream>using std::cout;using std::endl;class engine {public :void start() {cout << "engine->start" << endl;}void move() {cout << "engine->move" << endl;}void stop() {cout << "engine->stop" << endl;}void others() {cout << "engine->others" << endl;}};class wheel {public :void start() {cout << "wheel->start" << endl;}void move() {cout << "wheel->move" << endl;}void stop() {cout << "wheel->stop" << endl;}void test() {cout << "wheel->test" << endl;}};class car : private engine, private wheel {public :void start();void move();void stop();void test();};void car::start() {engine::start();wheel::start();others(); // 私有继承的公有成员成了私有成员}void car::move() {engine::move();wheel::move();}void car::stop() {engine::stop();wheel::stop();}void car::test(){wheel::test(); // 如果直接写test(),则是递归调用,会stackover}int main(int argc, char* argv[]) {car ca;ca.start();ca.move();ca.stop();ca.test();getchar();return 0;}/*engine->startwheel->startengine->othersengine->movewheel->moveengine->stopwheel->stopwheel->test*/

类car私有继承自类engine和类wheel,类car的三个成员函数start()、move()、stop()分别通过调用类engine和类wheel的成员函数实现,这样做的好处在于不需要重写而直接使用继承自基类的函数,同时因为是私有继承,能通过类car的对象调用,而不能直接调用类engine和类wheel的函数,防止不必要函数的曝光,因为对于使用类car对象的用户来说并不需要关心start()、move()、stop()的具体实现过程,也不需要控制engine和wheel的动作。

private继承就是一种纯粹的实现技术,意味着子类继承了父类,纯粹是看中了父类里面的某些函数实现罢了,不想跟你有别的关系,这个新的类将不会与父类指针有关系(接口都变private了)。

一般来说私有继承,与复合类的作用类似,可以互换(复合类更容易理解)。

在私有继承情况下,为了保证基类的一部分外部接口特征能够在派生类中也存在,就必须在派生类中重新声明同名的成员。利用派生类成员函数对私有成员(基类public、protected成员private继承后转变为私有成员)的访问能力,把基类的原有成员函数的功能照搬过来。这种在派生类中重新声明的成员函数具有比基类同名成员函数更小的作用域,因此在调用时,根据同名覆盖的原则,自然会使用派生类的函数。在面向对象的程序设计中,若要对基类继承过来的某些函数功能进行扩充和改造,可以通过这样的覆盖来实现。这种覆盖的方法,是对原有成员改造的关键手段,是程序设计中经常使用的方法。

比如有这么一个时间类 , 另一个widget也想有超时的功能:

class Timer{public:virtual void timeout(){ cout << __FUNCTION__ << endl;} //用于计算超时功能}; class Widget: private Timer{//private 继承private://这里也改private 或许比较好,如果是public接口,有可能不太好哦.客户误意味widget居然有超时!virtual void timeout() { Timer::timeout();//调用父类的超时功能cout << __FUNCTION__ << endl; //干自己的事}};

类似这种情况下就可以使用 private 继承 。如果改成public 继承或许有些奇怪,比如: Timer *pt = new Widget; ??? 好像两者没啥关系呢(private继承时,Timer *pt = new Widget;会出错,public继承OK)。

private继承意味着派生类只想获取并适当加工基类的某些函数实现。

-End-

    推荐阅读
  • 微信技术修炼方法(微信思维:微信团队首发观点)

    微信在过去的几年,以及在可以预见的未来,之所以对本书很多的人和机构变得如此重要,正是因为在这其中所蕴含的,被我们称之为微信思维的东西。《微信思维》预售今天是第十天,广大书友对此书关注的热情有增无减。在之前的分享中,我们提到《微信思维》集合了众多优秀通过微信实现价值的案例。微信作为一个社交工具平台,社交基因是微信最强的、最为基础的因素。这5大观点,是微信思维的准则。

  • 仙魔神圣第二十六集(仙魔神圣第二十六集)

    张良随太上老君来到藏宝阁,太上老君用仙指一点法盘,藏宝阁法阵打开,太上老君带张良走进法阵,然后他袖袍一挥,法阵自动合上。“张良好奇地问道。”那除了这两把上古仙剑,师伯祖这把太极仙剑排在第三自然当之无愧了!“张良不由自主地拉住太上老君的手说道:”师伯祖对我真是太好了,我真是无以为报,实在是衷心感激!

  • 综合能源产业发展(奋进新征程建功新时代)

    甘肃重通成飞新材料有限公司是科技创新先进企业、甘肃省战略新兴骨干企业、国家工信部“专精特新”小巨人企业,更是凉州区新能源装备制造领域的“主阵地”。在公司厂房内,工人们正在有序进行大兆瓦级风机叶片生产。“公司原有6条70米级风电叶片生产线,年均可生产风电叶片400套。”截至目前,该项目中2条83.4米、2条93米、2条90.5米共计6条叶片生产模具已陆续完成安装调试,并进入试生产阶段。

  • 封闭式冷却塔原理(空调用封闭式冷却塔工作原理)

    从冷凝器、吸收器或工艺设备等出来的温度较高的水,由冷却水循环泵加压输送到封闭式冷却塔的冷却盘管中。与此同时,靠安装在挡水板上面风机的抽吸作用,使空气自下而上流经冷却盘管,这样不仅可以强化冷却盘管外表面的放热,而且还可以及时带走蒸发所形成的水蒸气,以加速水分蒸发,提高冷却效果。具体来说,就是冷却盘管内温度较高的水以对流的形式将热量传给冷却盘管表面,这部分热量再由冷却盘管的内表面传到冷却盘管的外表面。

  • 泉州市狗证办理指南(泉州犬证在哪里办理)

    办理条件个人饲养犬只1、养犬人具有完全民事行为能力;2、有固定住所且独户居住;3、已按规定对犬只进行免疫;4、所养犬只是符合规定的有关犬只数量、品种、标准;5、法律、法规规定的其他条件。单位因工作需要饲养犬只1、有犬笼、犬舍和围墙等圈养设施;2、有看管犬只的专门人员;3、已按规定对犬只进行免疫;4、所养犬只是符合规定的有关犬只数量、品种、标准;5、有健全的养犬安全管理制度;6、单位所在地在办公楼、居民小区以外。

  • 核桃的吃法和做法大全(盘点核桃的吃法)

    核桃的吃法和做法大全生吃核桃仁。要想保证核桃的营养不会流失,最可靠的吃法就是生吃核桃仁,平时上班饥饿的时候吃一把核桃仁,营养又管饱。减肥的小伙伴对酸奶核桃仁一定不陌生,浓浓的酸奶,在上面撒上时令的水果、燕麦、饱满的核桃仁和其他坚果,低脂有营养美味。

  • 腊八节的由来和风俗(腊八节是怎么来的)

    后世人们便将每年的腊月初八,定为腊八节,还要吃腊八粥,以悼念那些远离家乡,遭秦国暴政施压的民夫。释迦牟尼为了早日立地成佛,每日仅食一麻一米。腊八节,也成为古印度时期,佛教的盛大节日。这些祭祀仪式,又被称之为“腊日之礼”。但是在中国古代,也有与之相同的典礼活动。对长辈而言,一旦过了腊八节,就会期盼游子们回乡。可是在今年倡导就地过年的前提下,腊八节则显得意义非凡。

  • 写日记需要注意什么(写日记注意事项)

    日记内容要真实日记是自己生活的记录,“真实”是日记的生命所以,我们要写出自己亲眼看到的、亲耳听到的和亲身感受到的人、事、景、物,有一说一,有二说二,不能胡编滥造,要坦诚地表达自己的真情实感,下面我们就来说一说关于写日记需要注意什么?写日记需要注意什么日记内容要真实日记是自己生活的记录,“真实”是日记的生命。因此,我们的每篇日记都可以确定一个明确的主题,使文章主题鲜明,内容集中。

  • 创业失败的真实感悟(创业失败后的人生感悟)

    但是市场是残酷的,创业经历1年3个月,无奈做出退出的决定,这时候社会给我上了一课!呵呵,我才知道,当自己没有价值的时候,你说话都是错的,直到我把外债还完,只保留大哥们的联系方式,不在联系,只在逢年过节去送点礼品,其余时间我决不再他们面前出现,人生路上的成长是需要经历的,让你撞了南墙,疼了,才能让你明白,人生感悟是需要眼泪和痛苦换来的,但这就是人生,谁也避免不了!

  • 发动机缸内直喷与多点电喷哪个好(电喷发动机该咋选)

    多点电喷方式人说价格便宜保养省心,积碳少。缸内直喷则是指燃油直接注入气缸燃烧室进行平顺高效地燃烧。明显多点电喷和缸内之喷在构造上面是有差异的,两种技术各有长处,接下来我们逐一来说多点电喷技术更加成熟,价格便宜,燃烧效率高,形成积碳少,同时维护保养比较方便、便宜。也就会使车辆油耗增加动力下降。