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

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-

    推荐阅读
  • 正确的煮鸡蛋方法不要壳(如何正确煮鸡蛋)

    首先先将鸡蛋清洗一下,有的鸡蛋表面可能有一些脏东西然后就将鸡蛋放入锅中,加入冷水水量的话刚好没过就可以了先向里面加入一大勺食盐搅拌然后用冷水浸泡几分钟,浸不到水的地方蛋白就不容易凝固了开大火,烧开之后就把火关小一点,用大火的话壳很容易就被煮破了煮的时间大概在八分钟左右即可,接下来我们就来聊聊关于正确的煮鸡蛋方法不要壳?正确的煮鸡蛋方法不要壳首先先将鸡蛋清洗一下,有的鸡蛋表面可能有一些脏东西。

  • 紫叶酢浆草喜阴还是喜阳(紫叶酢浆草是常年开花吗)

    紫叶酢浆草喜阳,也具有轻微的耐荫能力,日常可将紫叶粗将草放置到光线明亮的环境下养护,给予5小时左右的光照。养殖紫叶酢浆草时,可将园土、蛭石、珍珠岩混合制作成栽培的基质。在紫叶酢浆草生长期间,每个月还需施加一次氮磷钾元素丰富的复合肥来补充营养,注意肥料的浓度不宜过大,否则容易灼伤叶片,降低紫叶酢浆草的观赏性。注意在夏季气温较高时需停止施肥,避免产生肥害。

  • 佐助知道鸣人下跪是第几集 佐助得知鸣人下跪

    4、在那一战,佐助抓走了奇拉比,其实只是他的分身,但云隐村并不是知道事情的真相,为此四代雷影大发雷霆,再加上团藏更是想把佐助除之而后快,于是四代雷影打算全力追杀佐助。

  • 社会保障卡怎样办理社保卡(办理社保卡流程)

    社会保障卡怎样办理社保卡首先一般进入企业或单位,都会给每位员工办理社保,如果单位给你缴纳了社保,单位会为你一并办理社保卡,当然,个人去银行办理也可以。带着个人身份证和办理社保的相片回执单,填写办理业务单和社保卡办理申请单,都有模板的,不会填或不懂得可以问大堂经理及相关工作人员。

  • 白玫瑰不能随便送人为什么(白玫瑰相关介绍)

    跟着小编一起来看一看吧!白玫瑰不能随便送人为什么在古希腊传说中,玫瑰花不是一般的花,它的爱神的化身,所以无论是什么颜色的玫瑰都与爱情有着关系。白玫瑰被用来形容为纯洁的爱,要知道白玫瑰的花语含义是纯洁、高贵、天真及纯真的爱情,所以白玫瑰往往代表纯洁的爱。白玫瑰更适合送给爱人或是自己喜欢的人,所以,不要随便送人。

  • 赞美别人画画好的句子(关于赞美别人画画好的句子)

    小强在绘画艺术方面很有天赋,无论画什么都惟妙惟肖。这张人物画像惟妙惟肖,看来他画画的时候很细心。这张人物,画得惟妙惟肖,更可贵的不仅是人物的五官与真人一模一样,人物的神韵更是像了十成十。这幅山水图被画得惟妙惟肖,可以说精妙绝伦。画儿上的鸟儿栩栩如生,似乎要展翅飞翔。这幅画中的人物画得栩栩如生,有才无命。他既会写诗,又善作画,因而他的作品往往诗中有画,令人喜爱。

  • 提倡简朴的宣传语(简朴的宣传语)

    食不过佳,充饥则可;身不过华,遮身则可;,我来为大家科普一下关于提倡简朴的宣传语?下面希望有你要的答案,我们一起来看看吧!提倡简朴的宣传语食不过佳,充饥则可;身不过华,遮身则可;学问勤中得,富裕简中来;黄金本无种,出自勤俭家;一星半星,凑成两斤;省下烟酒钱,急难免求人;布衣暖,菜根香;细水长流有,大吃大喝不长久。

  • 泰拉瑞亚传送枪怎么用(泰拉瑞亚传送枪教学)

    首先把传送枪放置在快捷栏上面,之后通过左键/右键设置传送点,接近之后就可以传送到另外一个地方了。要注意的是两个传送点不能太远,玩家退出世界,死亡或者离传送点太远时会消失,时间长了好像也会消失,另外当玩家拿着传送枪的时候,下落速度将会变快。小限制传送枪的传送门必须放在是3格的平面上。所以传送门不会制造在1格或2格的物块平面上。图3转载自中文TerrariaWiki的镜像站(侵删)在游戏中的效果图文章参考中文TerrariaWiki的镜像站。

  • 真的会有男生喜欢这样的女生吗(原来男生都喜欢这样的女生)

    相信很多女生都会有这样的感受。调皮可爱男生对调皮可爱的女生没有抵抗力哦。高情商作为女生,总会被认为是感情动物。但这并不意味着每听一个悲伤的故事,女生们都会泪盈满眶。事实上,无论他看不看得到你,你都应该穿得好看有品位。而且因为女生通常不擅长倾听,只想要频频发表意见。与此同时,不要侮辱他,也不要借题发挥。好的恋爱一定是令人感到轻松愉快的。他们想要的其实是多一个能够亲密相处的朋友。

  • 小新air14pro酷睿独立显卡(小新Air14PLus笔记本)

    昨日晚,联想小新官方微博公布联想小新Air14Plus,海报主要介绍了新品笔记本的性能方面,采用AMD处理器NVIDIA显卡的组合。分辨率已经达到了联想小新Pro142021的水平。目前,新产品的更多信息尚未发布。上一代产品小新Air142021锐龙版于今年2月24日发布,售价4499元。此外,联想小新Air14Plus将在屏幕上进行大幅升级,从小新Air14的1080P升级到2.2K。