+ -
当前位置:首页 → 问答吧 → 紧急求教:纯虚函数已经实现了,为什么还提示抽象类不能初始化?

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

时间:2010-07-29

来源:互联网

本帖最后由 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. }
复制代码

作者: light511   发布时间: 2010-07-29

在newclass中的virtual int func1()=0;
把=0去掉。。

作者: rain_fish   发布时间: 2010-07-29

回复 rain_fish


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

作者: light511   发布时间: 2010-07-29



QUOTE:
回复  rain_fish


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




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

作者: hellioncu   发布时间: 2010-07-29

回复 hellioncu


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

作者: light511   发布时间: 2010-07-29

即使给出纯虚函数的定义, 依然是纯虚, 依然是抽象类。
要获得非抽象类, 要么改为非纯虚; 要么继承, 且去掉纯虚。

作者: OwnWaterloo   发布时间: 2010-07-29

回复 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. }
复制代码

作者: light511   发布时间: 2010-07-29

好好看看c++编程 这个是最基本的

作者: goubao198562   发布时间: 2010-07-29

回复 goubao198562


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

作者: light511   发布时间: 2010-07-29

回复 light511

看看有没有什么地方存在子类指针到父类指针的隐式转换?
如果有, 且不是在子类、友元作用域中, 那子类必须是public派生。

作者: OwnWaterloo   发布时间: 2010-07-29

回复 OwnWaterloo


    class NewClass: public MyClass
我把继承加上public,编译没错,但是链接的时候报错:1>ctest.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall myclass::NewClass::NewClass(void)" (??0NewClass@myclass@@QAE@XZ),该符号在函数 _main 中被引用

作者: light511   发布时间: 2010-07-29

相关阅读 更多

热门下载

更多