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

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-

    推荐阅读
  • 6月23日是什么日子(每年6月23日是什么日子)

    6月23日是什么日子奥林匹克日,1894年6月23日,国际奥委会在巴黎正式成立,为了纪念这一具有历史意义的一日,经过国际奥林匹克委员会的赞同,把这一日称为“奥林匹克日”或运动日。国际奥委会从1894年起将每年的6月23日定为国际奥林匹克日。经过国际奥林匹克委员会的赞同,把这一日称为“奥林匹克日”或“运动日”。

  • 塘鱼去腥方法(塘鱼去腥方法视频)

    将鱼放入温茶水浸泡15分钟左右后捞出,茶叶里含有的鞣酸具有收敛的作用,故可减少腥味。将鱼洗净后,用白酒涂遍,3分钟后用水洗去,能除去腥味。把活鱼泡在盐水里,盐水通过鱼的两鳃进入血液,土腥味就可以消失。做鱼之前,先将鱼在米酒中浸泡一下,然后再入锅,可去掉土腥味。首先将鱼清洗并解剖干净,倒入少许红酒腌制,半小时就可去腥。将鱼清洗干净切块,放入盘中加料酒少许腌制,20分钟左右即可去腥下锅。

  • 方脸终于找到适合的发型了(年末别再乱剪头发啦)

    “国字脸”又称方脸,特征是额头、颧骨、下颌等宽。不符合东方文化里的传统漂亮。只是你忽略了自身的优越条件,自信面对你认为不满的地方。很多人认为立体的方脸,只是符合西方的审美倾向。对于方脸在发型的选择上要避免过于压抑的造型,轻盈、透气,变得空气感很重要。注意锁骨发是内扣奥,直线条的锁骨发会容易显脸方。性感女神安吉丽娜·朱莉,标志性的方脸厚唇,非常具有力量感,这种性感男女通杀。

  • 安全生产汇报材料(安全生产汇报材料示例)

    近五年安全生产工作开展情况:安全生产形势总体稳中有降;,现在小编就来说说关于安全生产汇报材料?下面内容希望能帮助到你,我们来一起看看吧!下阶段安全生产工作思路建议:大力推进安全生产基层基础建设,增强安全生产监管能力和保障水平;继续深化安全生产宣传教育,提升全民安全生产素质。

  • 描写动物的句子(描写动物的句子有什么)

    描写动物的句子小黑狗有一双黑色的眼睛,水汪汪的;它还有像三角形的耳朵,听力可不差,就算一颗沙子掉下去,它也会听见,可以算是“顺风耳”了;他还有锋利的牙齿,看着它的牙齿,你就要打寒颤了;还有,还有,它的舌头细长,看着挺舒服的,看着看着还真有点想摸摸舌头。有的时候,它们耍赖,从中间插过来,我赶紧加快速度向前跑去追它们。于是,它理所当然地充当了“侍卫”的角色。身上还披着洁白的新装。

  • 塑料制品对环境的危害有哪些(塑料制品对环境有哪些危害)

    塑料制品对环境的危害有哪些塑料制品回收价值较低塑料制品在使用过程中除了散落在城市街道、旅游区、水体中、公路和铁路两侧造成“视觉污染”污染外,它还存在着潜在的危害。对动物生存构成威胁抛弃在陆地上或水体中的废塑料制品,被动物当作食物吞入,导致动物死亡。去年青海湖畔有20户牧民共有近千只羊因此致死,经济损失约30多万元。

  • 经典vivo壁纸(vivo壁纸风格让你有家感觉)

    看上去高贵,靠上去舒适

  • 旅游电商案例(电商创新案例之文化旅游篇)

    在2020年7月全新亮相的宽窄巷子官方旗舰店不仅是四川省内首家景区天猫官方旗舰店,更是阿里天猫重点引进的文旅行业“成都首店”。经过长达半年的筹备,宽窄巷子官方旗舰店一亮相便带来诸多惊喜。经过14年发展,截至目前,途风网服务客户累计超过100万人次出游,服务累计覆盖全球184个国家,与全球54个国家及地区旅游局达成战略合作,囊括精品旅游路线8000余条。

  • 苹果快捷键指令教程(苹果快捷键调用方法)

    下面我们来看详细的操作步骤。6、点击自定顶层菜单,可以修改或替换悬浮球中的快捷功能。

  • 早安励志心情说说(盘点早安励志心情说说)

    早安励志心情说说?早安励志心情说说低头走路的人只看到大地的厚重,却忽略了高空的高远;抬头走路的人,只看到高空的广阔,却忽略了脚下的艰辛与险峻。这个社会,是赢家通吃,输者一无所有。你今天的态度决定了你明天的位置,早安!保持健康快乐的心态,不要在意一城一池的得失。早安[玫瑰][玫瑰]人生就像钟表,可以回到起点,却已不是昨天!抱最大的希望,尽最大的努力,做最坏的打算。从绝望中寻找希望,人生终将辉煌,早安!