免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7396 | 回复: 19

紧急求教:纯虚函数已经实现了,为什么还提示抽象类不能初始化? [复制链接]

论坛徽章:
0
发表于 2010-07-29 13:26 |显示全部楼层
本帖最后由 light511 于 2010-07-29 13:28 编辑

纯虚函数已经实现了,为什么还提示抽象类不能初始化?
error C2259: 'myclass::NewClass' : cannot instantiate abstract class

代码如下
myclass.h如下:

  1. namespace myclass
  2. {
  3.         class  MyClass
  4.         {
  5.         public:
  6.                 MyClass();
  7.                 static int myget();
  8.                 virtual int func1()=0;
  9.                 virtual int func2()=0;
  10.                 static void myset(char **);
  11.                 ~MyClass();
  12.         };

  13.         class NewClass: MyClass
  14.         {
  15.         public:
  16.                 NewClass();
  17.                 virtual int func1()=0;
  18.                 ~NewClass();
  19.         };
  20. }
复制代码
myclass.cpp如下:

  1. #include<iostream>
  2. #include"myclass.h"
  3. int myclass::MyClass::myget()
  4. {
  5.         return 111;
  6. }
  7. void myclass::MyClass::myset(char ** p)
  8. {
  9.         * p=(char*)malloc(10);
  10.         char *t="good";
  11.         strcpy(*p,t);
  12.         return ;
  13. }
  14. int myclass::NewClass::func1()
  15. {
  16.         return 1;
  17. }

复制代码
mytest.cpp如下:

  1. #include<iostream>
  2. #include"myclass.h"
  3. using namespace std;
  4. using namespace myclass;

  5. int main()
  6. {
  7.         int x = MyClass::myget();
  8.     cout<<"x="<<x<<endl;
  9.         char * p;
  10.         MyClass::myset(&p);
  11.         cout<<"p="<<p<<endl;
  12.         free(p);
  13.         NewClass oneclass=new NewClass();
  14.                 MyClass * twoclass=new NewClass();
  15.         return 0;
  16. }
复制代码

论坛徽章:
0
发表于 2010-07-29 13:29 |显示全部楼层
在newclass中的virtual int func1()=0;
把=0去掉。。

论坛徽章:
0
发表于 2010-07-29 13:35 |显示全部楼层
回复 2# rain_fish


     error C2259: 'myclass::NewClass' : cannot instantiate abstract class
1>        due to following members:
1>        'int myclass::MyClass::func2(void)' : is abstract
去掉之后还报这个错,但是func2,我的子类中并没有这个函数阿,这是什么道理,难道要在子类中全部实现父类的纯虚函数?

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2010-07-29 13:39 |显示全部楼层
回复  rain_fish


     error C2259: 'myclass::NewClass' : cannot instantiate abstract class
1>  ...
light511 发表于 2010-07-29 13:35



    不能还有纯虚函数没实现的

论坛徽章:
0
发表于 2010-07-29 13:41 |显示全部楼层
回复 4# hellioncu


    谢谢,我把纯虚函数都实现了,但还有个错: error C2243: 'type cast' : conversion from 'myclass::NewClass *' to 'myclass::MyClass *' exists, but is inaccessible
好像是代码中MyClass * twoclass=new NewClass();这句的错,这样不对吗?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2010-07-29 13:43 |显示全部楼层
即使给出纯虚函数的定义, 依然是纯虚, 依然是抽象类。
要获得非抽象类, 要么改为非纯虚; 要么继承, 且去掉纯虚。

论坛徽章:
0
发表于 2010-07-29 13:47 |显示全部楼层
回复 6# OwnWaterloo


    我已经改了,但还报错
1>e:\test\ctest\ctest\ctest\ctest.cpp(15) : error C2243: 'type cast' : conversion from 'myclass::NewClass *' to 'myclass::MyClass *' exists, but is inaccessible

  1. namespace myclass
  2. {
  3.         class  MyClass
  4.         {
  5.         public:
  6.                 MyClass();
  7.                 static int myget();
  8.                 virtual int func1()=0;
  9.                 virtual int func2()=0;
  10.                 static void myset(char **);
  11.                 ~MyClass();
  12.         };

  13.         class NewClass: MyClass
  14.         {
  15.         public:
  16.                 NewClass();
  17.                 virtual int func1();
  18.                 virtual int func2();
  19.                 ~NewClass();
  20.         };
  21. }
复制代码

  1. #include<iostream>
  2. #include"myclass.h"
  3. int myclass::MyClass::myget()
  4. {
  5.         return 111;
  6. }
  7. void myclass::MyClass::myset(char ** p)
  8. {
  9.         * p=(char*)malloc(10);
  10.         char *t="good";
  11.         strcpy(*p,t);
  12.         return ;
  13. }
  14. int myclass::NewClass::func1()
  15. {
  16.         return 1;
  17. }
  18. int myclass::NewClass::func2()
  19. {
  20.         return 2;
  21. }

复制代码

  1. #include<iostream>
  2. #include"myclass.h"
  3. using namespace std;
  4. using namespace myclass;

  5. int main()
  6. {
  7.         int x = MyClass::myget();
  8.     cout<<"x="<<x<<endl;
  9.         char * p;
  10.         MyClass::myset(&p);
  11.         cout<<"p="<<p<<endl;
  12.         free(p);
  13.         NewClass *oneclass=new NewClass();
  14.         MyClass * twoclass=new NewClass();

  15.         return 0;
  16. }
复制代码

论坛徽章:
0
发表于 2010-07-29 13:47 |显示全部楼层
好好看看c++编程 这个是最基本的

论坛徽章:
0
发表于 2010-07-29 13:49 |显示全部楼层
回复 8# goubao198562


    这不正在学吗,边学边实践,到这,这个问题不太理解.请高手赐教.不胜感激.

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2010-07-29 13:51 |显示全部楼层
回复 7# light511

看看有没有什么地方存在子类指针到父类指针的隐式转换?
如果有, 且不是在子类、友元作用域中, 那子类必须是public派生。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP