爱美容
当前位置: 首页 美容百科

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

时间:2023-06-30 作者: 小编 阅读量: 1 栏目名: 美容百科

派生类新成员的加入是继承与派生机制的核心,是保证派生类在功能上有所发展的关键。可以根据实际情况的需要给派生类添加适当的数据和函数成员,来实现必要的新增功能。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-

    推荐阅读
  • 听觉的秘密(听觉世界里的潜规则)

    鸡尾酒会效应说起大脑的能力强,至今,大脑在处理声音方面的一个功能还在让所有科学家惊叹,这个功能的神奇机制至今也还是个谜。这种功能有个有趣的名字,叫做“鸡尾酒会效应”。动物也展现鸡尾酒会效应最近的研究发现,很多动物的听觉系统也具有这种鸡尾酒会效应的功能,例如鸟儿们经常群集一起,叽叽喳喳开大会,但它们往往只是回应自己伴侣的叫声,显然它们能够从嘈杂的叽喳声中分辨出伴侣的声音。

  • 淄博环保供热第一供热分公司供暖范围在哪?

    淄博环保供热第一供热分公司供暖范围在哪?供暖小常识之暖气不热的具体排气方法:每个暖气片上都有一个手动排气阀,用户可轻轻拧松手动排气阀,听到排气声立即停止扭动排气阀,若见有稳定水流流出可将排气阀轻轻拧紧。排过气后,若暖气片还是不热,应请专业人员查明原因,帮助解决问题,切不可盲目放水。

  • 窗帘是什么材质 高精密窗帘是什么材质

    透明类的丝质面料,手感柔软、纹路流畅,用做窗帘,既浪漫又高雅。丝质窗帘最大的特点也是最明显的缺点就是价格昂贵,难以清洗。古代太后或皇后临朝听政,殿上用竹帘遮隔,则称为垂帘听政。

  • 普惠性幼儿园能否增加收费项目(普惠性幼儿园覆盖率将超过80)

    普惠性幼儿园覆盖率将超过80日前,陕西省教育厅和陕西省发改委联合印发了《陕西省教育事业发展“十四五”规划》,其中明确提出要强化学前教育规划建设,将新增公办园300所,公办园占比和公办园在园幼儿占比保持50%以上,普惠性幼儿园覆盖。

  • 林清玄人生感言(承担是生命里最美的东西)

    更令人赞叹的是,那个煮面的老板还边与顾客聊着闲天。对于孩子突如其来的谈话,我感到莞尔,并且立即坦然承认,我一定输给卖面的人。他们不用言语,而以动作表达了对生命的承担。在古印度人传统的观念里,认为只要是两条河交会的地方一定是圣地,这是千年智慧累积所得到的结论。当然,在我们以神圣的心面对世界时,自己就有了承担,也就成为值得敬佩的人之一。事实上,所有的比较都是一种执著。

  • 白花蛇舌草的功效与作用(白花蛇舌草的功效与作用效)

    白花蛇舌草一年生小草本,生于潮湿的田边、沟边、路旁和草地。白花蛇舌草药材全体扭成团块,灰绿色至灰棕色。白花蛇舌草补充信息:炮制:取原药材除去杂质,抢水洗净,稍润,切段,干燥。白花蛇舌草适合人群:孕妇慎用白花蛇舌草的功效和作用白花蛇舌草味苦、微甘,性微寒;入肺、肝、胃经;具有清热利湿,解毒抗癌的功效;主治肺热喘咳,咽喉肿痛,湿热黄疸,热淋涩痛,水肿,痢疾肠炎,肠痈,痈肿疮疡,毒蛇咬伤,癌肿。

  • 苏州西站长途汽车站停运通知(苏州市区79班汽车客运班线停班)

    苏州汽车客运总站表示,将给因台风造成停班班次的旅客办理免费退票。昆山客运中心站正密切关注“利奇马”的走向及发展趋势,动态调整班次开行方案并及时通知广大旅客相关停班信息,确保旅客安全出行。有去机场、高铁站、火车站换乘的旅客请适当增加出行时间,以免受台风影响耽误行程。如因天气原因导致班次停运,乘车人可在当天携带本人身份证持车票到车站窗口办理全额退票。

  • 二氧化碳用途(二氧化碳的用途)

    二氧化碳是我们很熟悉的一种气体,大量的二氧化碳会导致温室效应的加剧。学过生物的同学都知道,植物的光合作用是需要二氧化碳作为原料的。在很多农场里面,也会放置产生二氧化碳的仪器,提高农作物的产量。二氧化碳灭火器可用于扑灭图书、重要仪器的失火,因为扑灭后没有任何的残留物质。其实这种效果都是由人为用干冰造成的。以及人工降雨也都会用到二氧化碳等,用途广泛。

  • 桂林社保卡要自己去银行办吗(桂林社保卡要自己去银行办吗现在)

    制卡人1寸白底免冠深色上衣证件纸质彩色照片1张。如委托代办,需提供受委托人的居民身份证原件。填写社会保障卡制卡申领表。社会保障卡启用1.办理条件本统筹区已领取社会保障卡,但未激活社保功能的参保人员。广西区内转入已经持有社会保障卡的参保人员。

  • tvb五花是谁(深扒TVB五朵金花)

    根据港媒报道,杨怡与胡定欣在剧组拍摄期间已经有了两女相争的苗头。根据当时报道,吴卓羲公开表示,自己与徐子珊仅拍摄了一天电视剧,便成为了男女朋友,使得二人被视为最佳荧幕情侣。在此期间,黄宗泽与五花们合作过多部作品,荧幕情侣也是组合了一对又一对。此外,同样家庭事业双丰收的还有勤恳劳模杨怡。然而,现实生活中,与杨怡定情的却是在剧中饰演马国明弟弟的罗仲谦。杨怡仍然认定罗仲谦,并于2016年10月于英国完婚。