范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

C语言模拟面向对象技术如何利用函数指针的继承来实现多态?

  假如想在C中使用面向对象技术,应该怎样做?最重要的是要找到虚函数的替代技术。可以在struct中添加一个"类型域"来指明对象是基类还是某个派生类:#include   struct Shape1{     enum Kind{circle, rectangle}kind; };  void draw(struct Shape1* p)  // 仿虚函数 {     switch(p->kind){     case Shape1::circle:         printf("draw a circle! ");         break;     case Shape1::rectangle:         printf("draw a rectangle! ");         break;     } }  void f(struct Shape1* pp) {     draw(pp); } int main() {     struct Shape1 rec;     rec.kind = Shape1::rectangle;     f(&rec);      while(1);     return 0; }
  以上代码可以正常工作,但当加入一个新的形状,必须修改伪虚函数draw(),为switch语句增加一个case分支。这意味着不可能将"伪虚函数"放在库中,因为用户不得不频繁修改这些函数。虚函数最有效的替代技术之一是函数指针://C语言模拟实现继承和多态 #include  typedef void (*FUNC)();    //使用函数指针来模拟实现  struct B            //父类 {     FUNC _func;     int _a; }; struct D            //子类 {     B _ca;        int _b; }; void B_Func()       //父类的成员函数 {     printf("B:_func() "); } void D_Func()       //子类的成员函数 {     printf("D:_func() "); } // 父类的指针可以指向父类或者子类的对象 void func(B *ptr)   // 公有的接口 {     ptr->_func(); } void TestC() {     B b;     D d;     // 对父类和子类的成员函数进行初始化     b._func=B_Func;     d._ca._func=D_Func;     // 父类的对象调用父类的成员函数     b._func();      // B:_func()     // 子类的对象要调用自己的成员函数,需要先找到自己继承过来的父类的函数指针     // 再调用父类的成员函数     d._ca._func();  // D:_func()       B *ptr=&b;      // 一个父类的指针指向父类的对象     ptr->_func();   // B:_func()     ptr=(B *)&d;    // 父类的指针也可以指向子类的对象,在C语言中需要强制类型转换     ptr->_func();   // D:_func()     func(&b);       // B:_func()     func((B *)&d);  // D:_func() }  int main() {     TestC();     while(1);     return 0; } /* B:_func() D:_func() B:_func() D:_func() B:_func() D:_func() */
  模仿虚函数表:#include  using namespace std;  typedef void (*EatPtr)(); typedef void (*PlayPtr)();  typedef struct _virtualPtrTable{     EatPtr eat;     PlayPtr play; }VPtrTable;  typedef struct _base{     VPtrTable vptrTable;     int age; }Base;  typedef struct _deriveA{     Base base;     int age; }DeriveA;  typedef struct _deriveB{     Base base;     int age; }DeriveB;  /** 基类的实现函数 **/ void baseEat(){     cout<<"基类在吃饭....."<vptrTable.eat();     base->vptrTable.play();     cout<<"age:"<age<vptrTable.eat();     base->vptrTable.play();     cout<<"age:"<age<
NASA计划探测太阳系目前最大个小行星日前,美国亚利桑那州立大学航天专家约瑟夫奥鲁克在月球和行星科学会议(LPSC)上透露,美国国家航空航天局(NASA)计划发射小卫星探测小行星帕拉斯。帕拉斯也叫智神星,位于火星与木星中国火星登陆计划曝光,为何首选女航天员?专家透露一特别原因图为王亚平近日,据媒体报道,最近中国火星登陆计划曝光,有消息表示中国将在20年后有望进行登陆火星计划,对于这次中国登陆火星计划,有专家提出建议最好派出女性航天员执行任务,那么为何首迄今最大宇宙三维天图出炉图中左上部分为斯隆数字巡天(SDSS)展示的三维宇宙切片,图中右上部分为DESI在项目启动最初几个月观测得到的三维宇宙切片。图中的每个点代表一个星系,地球位于中心位置,最远距离的星半导体显示出难以捉摸的量子物理模型研究人员在康奈尔和康奈尔两维物质之间发现了一个奇异的绝缘体。通过这样做,他们实现了一个难以捉摸的模型,这个模型是十多年前首次提出的,但科学家们一直未能证明,因为似乎不存在合适的材料海水是哪里来的?每分钟就有20颗彗星给地球带来100吨水地球上的海水到底是从哪里来的?茫茫大海,碧波荡漾,神秘而迷人,这些海水到底是从哪里来的?广袤的海洋占据了地球表面的四分之三,而地球上96。53的水都是海水。可以看出,地球上的水量以探索小行星防御新路径来源人民网人民日报浩瀚的太阳系中,围绕太阳公转的不仅有八大行星,还有千千万万个头不等形状各异运行轨道不同的小行星。它们在装点太空的同时,也带来了撞击地球的风险和隐患。或许有人认为担冥王星之争续三傅承启文(接续上一期)对此始料不及的国际天文联合会不得不于1999年2月4日匆匆忙忙出来表态,发表了当年度第一号声明,表示目前的一些报道片面理解和误解了行星系科学部讨论的主题。并声明没有任地球四大洋变五大洋?几千年以来,生命的起源一直是人类孜孜不倦的研究课题。从现有的研究成果来看,人类文明起源于海洋。虽然小行星撞击地球,剧烈的地壳运动和海路运动,形成了我们今天看到的地理环境。我们可以说我们成功往返月球的秘密,都在这里了来源央视新闻客户端深空探测堪称人类航天技术的皇冠月球是中国走进深空探测的必经之地让我们通过一组数字去回望中国人飞天揽月的浪漫故事38万千米月球,别名太阴玄兔婵娟玉盘,平均半径约17月球上有水吗?嫦娥五号告诉你不为人知的秘密月球上有水吗?因为太阳和外太空不断释放带电粒子流,所以它们正在成为太阳系舞台上的主角。它们帮助行星形成大气层,给暴露的表层消毒,甚至给寒冷的木星带来维持生命的氧气。在这些粒子的最新俄罗斯将研发可重复使用太空货运飞船,取代进步号来源环球网环球网报道记者徐璐明俄罗斯将制造可重复使用的太空货运飞船,用于取代现役的进步号货运飞船。俄罗斯塔斯社8月30日报道称,俄罗斯能源火箭航天公司首席设计师弗拉基米尔索洛维约夫
苏州一酒店发生坍塌事故引发的争议70年后房子拆还是不拆?苏州一酒店发生坍塌事故引发的争议70年后房子拆还是不拆?一种观点认为,苏州一已有多年房龄的酒店坍塌,虽然具体原因有待公布,但类似大量的老房子,到时该如何处置,该引起重视了。拆迁小高文学作品里的告白,哪个最打动你呢?1荷西你是不是一定要嫁个有钱人。三毛如果我不爱他,他是百万富翁我也不嫁,如果我爱他,他是千万富翁我也嫁。荷西说来说去你还是要嫁有钱人。三毛也有例外的时候。荷西如果跟我呢?三毛那只要夏天跑步补水误区七月的风暖暖的,连云都变热热的,不久后天闷闷的,汗流浃背身上很快就湿湿的,如果家不是住在云南昆明丽江这样四季如春的地方,绝大多数跑者都要在现在这个时候经受夏季高温的折磨。不少人室外如果最近亏了钱,不妨去哪壶不开,提一下哪壶。有没有跑友,本想用基金赚的钱,给自己即将到来的端午假期出个机票,定个好一点的酒店。结果最近发现,呵呵。暴跌的钱,够住好几晚的起点附近海景五星级豪华套房了。本来替跑跑到最后只会一无所有两个人接力跑也追不上闫龙飞和李子成5月22日23日举行的TNF100莫干山越野赛,官方通报35km组别选手徐某存在将号码布转让给他人并通过接力方式完成比赛的情况。根据赛事竞赛规则惩罚办法13让他人替跑或将号码布给予全世界最大家庭家长去世6月13日,一个76岁男子在印度去世。他是世界上最大家庭的家长,有39个妻子和94个子女,另外还有33个孙辈以及1个曾孙。他是在当地医院急救病房去世的。该男子是一个基督教分支的领导跑圈这些行为?NONONO!好好跑步才是王道前些天,一位明星作家野史传记写得最好的人写了一篇文章,夹枪带棍将文字直指一位跨文学界投资圈,还特爱跑步写过不少有关跑步专栏和金句的牛人,说总给别人讲如何不油腻的他比谁都更油腻。不过观点从孙杨到钱鼎彬,从竞技到业余,先要学会遵守规则本不想提孙杨。但还是不得不提。作为中国游泳史上最强大的运动员之一,以这种方式近乎断送自己职业生涯,代价之大,让人叹息。但直至重审结果出炉,从孙杨的国内律师张起淮的微博言语中看出,他新晋奶爸吴向东,铁血跑男的舐犊柔情在这个越来越多年轻人选择不婚不育保平安的当下,仍有一大批男士选择义无反顾地步入婚姻殿堂,娶妻生女。今天,我们有关父亲节的主角,就是一位当爸爸不足两个月的新手吴向东。万事非体验不为真跑步的人都不健身吗?在生活水平逐渐提高,人们对参与体育运动的积极性也日趋高涨。类似北马上马等金标赛事,参赛名额可谓是一签难求,可见其火热程度,而另一方面,健身房也如雨后春笋般出现在城市的大街小巷。跑步心理学看透人心从众心里把我的观点换成大家的观点,例如你想你劝你朋友到某家店吃饭,把我觉得这家挺好吃的,换成大家都觉得这家店好吃避免否认对于大多数人来说,想要明确说不都是很困难的,我们拒绝别人常会