CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

如何继承这样的类?

楼主onestation(新手)2006-07-04 12:19:30 在 C/C++ / C++ 语言 提问

有接口IAB和IB都有printb操作,IB的实现B中实现了printb,然后在IAB的实现中只实现printa,如何继承B中的printb,AB和B最后都能实例化?  
  class   IAB  
  {  
  public:  
          IAB(){};  
          virtual   ~IAB(){};  
          virtual   void   printa()=0;  
          virtual   void   printb()=0;  
  };  
  class   IB  
  {  
  public:  
          IB(){};  
          virtual   ~IB(){};  
          virtual   void   printb()=0;  
  };  
   
  class   B   :   public   IB  
  {  
  public:  
          B():ib(2){};  
          virtual   ~B(){};  
          void   printb(){printf("%d\n",   ib);};  
          int   ib;  
  };  
   
  class   AB   :   public   B,   public   IAB  
  {  
  public:  
          AB():ia(1){};  
          virtual   ~AB(){};  
          void   printa(){printf("%d\n",   ia);};  
          //void   printb(){};这个实现能不能不写  
          int   ia;  
  };  
   
   
  int   _tmain(int   argc,   _TCHAR*   argv[])  
  {  
  AB   ab;  
          ab.printa();  
          ab.printb();  
          B   b;  
          b.printb();  
          return   0;  
  } 问题点数:100、回复次数:6Top

1 楼lxpws(你被耍了)回复于 2006-07-04 13:02:15 得分 20

不写恐怕不行,因为B只实现了IB中的printb,而IAB中的printb还没有被实现,可以这样:  
  class   AB   :   public   B,   public   IAB  
  {  
  public:  
          AB():ia(1){};  
          virtual   ~AB(){};  
          void   printa(){printf("%d\n",   ia);};  
          void   printb(){B::printb();};  
          int   ia;  
  };  
  Top

2 楼sharpdew(风刃)回复于 2006-07-04 13:07:22 得分 20

如果是你那样子的类的话,就应该把接口IAB拆分为两个接口类IA和IB才比较方便。Top

3 楼al0n9(终于有四条内裤了)回复于 2006-07-04 13:33:22 得分 20

应该是不行的。实际上,AB当中有两个printb,一个是继承自IAB的printb,另一个是继承自B的printb。继承自B的printb在IB中被定义为纯虚函数,在B中已经实现。但是继承自IAB的printb仍然是一个纯虚函数,你必须实现此printb。而且在实现此printb的时候,可能需要通过域名解析指定.   AB::IAB::printb()Top

4 楼rollor_phoe(柔枫)回复于 2006-07-04 14:12:35 得分 20

不写应该是不行的,因为是虚函数,采用的是动态联编,当调用   ab.printb();时,可能会找不到所需的函数而不能执行。Top

5 楼onestation(新手)回复于 2006-07-04 16:25:47 得分 0

非常感谢大家,我这样实现不知道有没有什么问题?把IAB和AB分开定义  
   
   
  class   IA  
  {  
  public:  
          virtual   ~IA(){};  
          virtual   void   printa()=0;  
  };  
   
  class   IB  
  {  
  public:  
          virtual   ~IB(){};  
          virtual   void   printb()=0;  
  };  
   
  class   IAB   :   public   virtual   IA,   public   virtual   IB  
  {  
  };  
   
  class   A   :   public   virtual   IA  
  {  
  public:  
          A():ia(1){};  
          virtual   ~A(){};  
          void   printa(){printf("%d\n",   ia);};  
          int   ia;  
  };  
   
  class   B   :   public   virtual   IB  
  {  
  public:  
          B():ib(2){};  
          virtual   ~B(){};  
          void   printb(){printf("%d\n",   ib);};  
          int   ib;  
  };  
   
  class   AB   :   public   A,   public   B  
  {  
  };  
   
   
  int   _tmain(int   argc,   _TCHAR*   argv[])  
  {  
  AB   ab;  
          IAB   *   pab   =   reinterpret_cast<IAB*>(&ab);  
          pab->printa();  
          pab->printb();  
          return   0;  
  }Top

6 楼lyskyly(浮生三笑)回复于 2006-07-04 16:56:19 得分 20

这样应该没问题Top

相关问题

关键词

得分解答快速导航

  • 帖主:onestation
  • lxpws
  • sharpdew
  • al0n9
  • rollor_phoe
  • lyskyly

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo