Chinaunix

标题: 紧急求教:纯虚函数已经实现了,为什么还提示抽象类不能初始化? [打印本页]

作者: light511    时间: 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. }
复制代码

作者: rain_fish    时间: 2010-07-29 13:29
在newclass中的virtual int func1()=0;
把=0去掉。。
作者: light511    时间: 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,我的子类中并没有这个函数阿,这是什么道理,难道要在子类中全部实现父类的纯虚函数?
作者: hellioncu    时间: 2010-07-29 13:39
回复  rain_fish


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



    不能还有纯虚函数没实现的
作者: light511    时间: 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();这句的错,这样不对吗?
作者: OwnWaterloo    时间: 2010-07-29 13:43
即使给出纯虚函数的定义, 依然是纯虚, 依然是抽象类。
要获得非抽象类, 要么改为非纯虚; 要么继承, 且去掉纯虚。
作者: light511    时间: 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. }
复制代码

作者: goubao198562    时间: 2010-07-29 13:47
好好看看c++编程 这个是最基本的
作者: light511    时间: 2010-07-29 13:49
回复 8# goubao198562


    这不正在学吗,边学边实践,到这,这个问题不太理解.请高手赐教.不胜感激.
作者: OwnWaterloo    时间: 2010-07-29 13:51
回复 7# light511

看看有没有什么地方存在子类指针到父类指针的隐式转换?
如果有, 且不是在子类、友元作用域中, 那子类必须是public派生。
作者: light511    时间: 2010-07-29 13:59
回复 10# OwnWaterloo


    class NewClass: public MyClass
我把继承加上public,编译没错,但是链接的时候报错:1>ctest.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall myclass::NewClass::NewClass(void)" (??0NewClass@myclass@@QAE@XZ),该符号在函数 _main 中被引用
作者: OwnWaterloo    时间: 2010-07-29 14:03
回复 11# light511

NewClass的构造函数没有定义。
作者: light511    时间: 2010-07-29 14:18
回复 12# OwnWaterloo


    非常感谢大家,终于搞定了,C++的路上又前进了一步
作者: srdgame    时间: 2010-07-29 15:04
記得某書有講純虛函數,印象最深的是:
  1. class Base {
  2.     virtual void fun1() = 0 {
  3.          std::cout << "default impl" << std::endl;
  4.     }
  5. };
  6. class Sub1 : public Base {
  7.      void fun1() {
  8.           Base::fun1();
  9.     }
  10. };
复制代码

作者: beyond_touch    时间: 2010-07-29 17:11
記得某書有講純虛函數,印象最深的是:
srdgame 发表于 2010-07-29 15:04


什么怪异的东西呀
作者: srdgame    时间: 2010-07-30 00:09
呵呵,。。。。
作者: sohu2000000    时间: 2010-07-30 01:15
纯虚函数已经实现了,为什么还提示抽象类不能初始化?
error C2259: 'myclass::NewClass' : cannot instanti ...
light511 发表于 2010-07-29 13:26



    需要实现全部接口
作者: ah13k    时间: 2010-07-30 08:02
你应该多看看书,而不是随便拿到个问题就问别人,如果你有一个这样的问题,表示你其实基础都没搞清楚。

个人建议罢了,不必人生攻击。
作者: shangugulang    时间: 2010-12-18 08:41
好好看看c++编程 这个是最基本的
goubao198562 发表于 2010-07-29 13:47



    鄙视这种人....
作者: jhui66    时间: 2010-12-18 09:22
是的,上面的几位说的很对




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2