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

关于类继承问题

楼主ewm()2004-08-01 09:28:19 在 C/C++ / C++ 语言 提问

class   A    
  {    
  public:    
                  virtual   void   aa()=0;    
  };    
  class   a:   public   A    
  {    
  public:    
                  void   aa(){};    
  };    
  class   B:public   A    
  {    
  public:    
                  virtual   void   bb()=0;    
  };    
  class   b:   public   a,public   B    
  {    
  public:    
   
                  void   bb(){};    
  };    
  int   _tmain(int   argc,   _TCHAR*   argv[])    
  {    
                  return   0;    
                  b   bb;    
                  bb.aa();    
  }    
  error   C2259:   “b”   :   不能实例化抽象类    
  请问这种问题怎样解决 问题点数:20、回复次数:4Top

1 楼oldjackyone(老兔子)(她妈妈说:以为你真的很帅么???)回复于 2004-08-01 09:49:30 得分 8

#include   <iostream>    
  using   namespace   std;  
   
   
  class   A    
  {    
  public:    
                  virtual   void   aa()=0;    
  };    
  class   a:   public   A    
  {    
  public:    
                  void   aa(){};    
  };    
  class   B:public   A    
  {    
  public:    
  void   aa(){}//虚函数需要在派生类中定义它的函数体。  
                  virtual   void   bb()=0;    
  };    
  class   b:   public   a,public   B    
  {    
  public:    
   
                  void   bb(){};    
  };    
  int   main()    
  {    
                  return   0;    
                  b   bb;    
                  bb.A::aa();   //如果是bb.aa()会出现二义性,因为不知道是调用a类还是B类中的aa()  
  }    
   
  Top

2 楼UPCC(杂食动物)回复于 2004-08-01 10:06:30 得分 10

 
  class   A    
  {    
  public:    
                  virtual   void   aa()=0;    
  };    
  class   a:   public   A    
  {    
  public:    
                  void   aa(){};    
  };    
  class   B:public   A    
  {    
  public:    
                  void   aa(){cout<<"test"<<endl;}  
  //上面纯虚函数没有定义类就是抽象类就不可以实例化。  
                  virtual   void   bb()=0;    
  };    
  class   b:   public   a,public   B    
  {    
  public:    
  void   aa(){a::aa();}  
  //必须指明调用那个aa函数,不然编译器怎么编译的?  
                  void   bb(){};    
  };    
  int   _tmain(int   argc,   _TCHAR*   argv[])    
  {    
                  return   0;   //这一句应该放在最后,你在这里就退出栈了,以后的怎么运行?  
                  b   bb;    
                  bb.aa();    
  }Top

3 楼leonchew(安静(静哥哥,找寻黄蓉中...))回复于 2004-08-01 10:13:09 得分 2

同楼上,要在派生类中写虚函数体.a类的   void   aa()   ,B   类的void   aa()和   b   类的void   bb{}最好都写.调用时,同时要显示说明.bb.A::aa();   如这种形式.Top

4 楼Rossonero(奴家只求大官人快些)回复于 2004-08-01 17:56:43 得分 0

因为在多重继承的过程中,编译器发现有多个相同的成员函数,不知道调用的是哪个,产生了2义性.改成虚拟继承即可.  
   
  class   A    
  {    
  public:    
  virtual   void   aa()=0;    
  };    
   
  class   a:   virtual   public   A     //让a和B都是虚拟继承  
  {    
  public:    
  void   aa(){};    
  };  
     
  class   B:virtual   public   A    
  {    
  public:    
  virtual   void   bb()=0;    
  };    
   
  class   b:   public   a,public   B    
  {    
  public:    
   
  void   bb(){};    
  };    
   
  int   main(int   argc,   char   *   argv[])    
  {    
   
  b   bb;    
  bb.aa();    
  return   0;    
  }Top

相关问题

  • 类怎样继承
  • 类继承问题?
  • CDialogBar类的继承
  • VC继承类的困惑!
  • 类继承的问题!
  • 如何继承CRectTracker类?
  • VB中类怎样继承
  • 关于类的继承性
  • 求ListCtrl的继承类
  • 继承类的问题

关键词

  • virtual
  • aa
  • bb

得分解答快速导航

  • 帖主:ewm
  • oldjackyone
  • UPCC
  • leonchew

相关链接

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

广告也精彩

反馈

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