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

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-

    推荐阅读
  • 武则天的乳名叫啥 武则天这个名字是谁起的

    武则天的乳名叫华姑。武则天是并州文水人。唐朝至武周时期政治家,武周开国君主,也是中国历史上唯一的正统女皇帝、即位年龄最大(67岁)及寿命最长的皇帝之一(82岁)。武则天智略过人,兼涉文史,颇有诗才。有《垂拱集》及《金轮集》。

  • 采光不好的房子怎么装修(五大注意事项)

    宜选用哑光漆的家具和浅色柔丝光面砖。增大可利用的空间。客厅内摆放的家具会产生一些死角,并破坏色调整体的协调。为了解决这一矛盾,应根据客厅的具体情况,设计出合适的家具,靠墙展示柜及电视柜也要量身定做,节约每一寸空间。在视觉上保持了清爽,自然显得光亮。要留心阻止光源的阻碍物。又或者自己的院子围墙过高,导致采光不好。

  • 夏天美食做法家常菜100道开胃下饭(吃它的季节到了)

    吃它的季节到了夏天一到,这青山一天一个样,经过烈日的暴晒,骤雨的浇淋,那草木就蹿枝拔节很快地长起来,变得葱茏青绿了初夏时节,有一项碧绿青翠的蔬菜是我们必吃的盘中餐,那就是芦笋初夏的芦笋非常新鲜,而且肉质也变得更加厚。

  • 纳税人必须知道的8个税务常识(18个税种纳税期限大全)

    纳税年度自公历1月1日起至12月31日止。企业应当自年度终了之日起五个月内,向税务机关报送年度企业所得税纳税申报表,并汇算清缴,结清应缴应退税款。纳税人因移居境外注销中国户籍的,应当在注销中国户籍前办理税款清算。具体办法由海关总署另行规定。"3.纳税义务人应当自海关填发税款缴款书之日起15日内向指定银行缴纳税款。

  • 微信键盘皮肤怎么设置(微信键盘怎么设置皮肤)

    微信键盘皮肤怎么设置?在手机的微信或者短信或者其他可以打开键盘的应用中打开键盘,点击键盘左上角的输入法设置图标,页面显示输入法的各种设置功能;,我来为大家讲解一下关于微信键盘皮肤怎么设置?

  • 父亲节的礼物有哪些(适合送给父亲的礼物推荐)

    下面更多详细答案一起来看看吧!父亲节的礼物有哪些保温杯保温杯是一个神奇的存在,养生必备,要有茶漏百那种的,外面看上去有质感的。身为90后的我们,基本都在他乡异地奔忙,为了一点事业和生活而奋斗。很多时候忙于工作却疏忽了远在家乡还有个父亲在日夜挂念着我们。市面上最舒服的是蚕丝被,透气,轻,保暖,舒服,送给父母,让他们休憩时刻更温暖。推荐到正规商场或可信任的卖家购买,送给父母,质量更有保障。

  • 火之迷恋被验货是哪一集(火之迷恋有几集)

    火之迷恋被验货是27集。该剧于2017年7月24日在泰国GMM25台播出。电视剧是一种适应荧屏、专为在电视或网络视频平台上播映的戏剧样态。电视剧市场是随着广播事业和互联网新媒体的诞生而发展兴盛起来的,如今还创新产出了电影短剧、网络竖屏剧和互动剧等新型网络剧。

  • 向往的生活5播出时间(向往的生活的简介)

    下面希望有你要的答案,我们一起来看看吧!向往的生活5播出时间《向往的生活》第五季应该会在2021年的夏季播出,但具体的播出时间还没有确定。《向往的生活》是由湖南卫视、浙江合心传媒联合推出的生活服务纪实节目。节目中主人公一起守拙归田园,为观众带来一幅“自力更生、自给自足、温情待客、完美生态”的生活画面。

  • 说一句话就显示网络异常(最近我家网络怎么啦)

    最近我家网络怎么啦近段时间总能听到身边的朋友吐槽家里的移动宽带网络有点卡同为移动宽带的小编表示我家的网络挺好的呀!那么到底是哪里出错了呢?真是云浮移动的锅吗?还真不是!云浮移动可是一直在全力推进家庭宽带提速降费服务对重。

  • nba球员各项数据统计表(NBA档案库巨星云集的)

    在自己的首场Pro-Am比赛中,小小年纪的克劳福德没有丝毫怯意。赛后,克劳福德得到了克里斯蒂和加里-佩顿等多名NBA球员的称赞。此后,克劳福德追随克里斯蒂的脚步进入了雷尼尔海滩高中,率领校队拿下了华盛顿州高中冠军,还荣膺了华盛顿州年度最佳高中球员。截止到目前,克劳福德已经邀请了很多NBA球员来到TheCrawsOver打球。Pro-Am联赛举办20年后,在2017年正式更名为具有克劳福德个人烙印的“TheCrawsover”,为的就是表彰克劳福德对联赛做出的贡献。