LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 777|回复: 2

求助:继承时扩展类的问题[已解决,谢谢兄弟们]

[复制链接]
发表于 2008-6-2 11:53:22 | 显示全部楼层 |阅读模式
先看下这段代码
  1.   1 #include <iostream>
  2.   2
  3.   3 using namespace std;
  4.   4
  5.   5 class cBase1
  6.   6 {
  7.   7 public:
  8.   8     virtual void work();
  9.   9     cBase1() : a(0) {};
  10. 10     cBase1(int x) : a(x) {};
  11. 11 protected:
  12. 12     int a;
  13. 13 };
  14. 14
  15. 15 class cExt : public cBase1
  16. 16 {
  17. 17 public:
  18. 18     virtual void work();
  19. [color="Red"] 19 //  cExt() : a(0){  };[/color]
  20. 20 };
  21. 21
  22. 22 void cBase1::work()
  23. 23 {
  24. 24     cout << a << ": hello, word" << endl;
  25. 25 }
  26. 26
  27. 27
  28. 28 int main()
  29. 29 {
  30. 30     cBase1 *p;
  31. 31     p = new cExt;
  32. 32
  33. 33     p->work();
  34. 34
  35. 35     delete p;
  36. 36
  37. 37     for ( int i = 1; i < 10; i++)
  38. 38     {
  39. 39         //if (i % 2 > 0)
  40. 40             p = new cBase1(i);
  41. 41         //else
  42. 42         //  p = new cExt(i);
  43. 43         p->work();
  44. 44         delete p;
  45. 45     }
  46. 46 }
复制代码


编译时报错如下
  1. mikkoyue [ ~/c++/test ]$ g++ vtable.cpp -o vtable
  2. /tmp/cc6m3Le0.o: In function `cExt::cExt()':
  3. vtable.cpp:(.text._ZN4cExtC1Ev[cExt::cExt()]+0x12): undefined reference to `vtable for cExt'
  4. collect2: ld 返回 1
复制代码


如果把19行注释去掉,让其执行,报错如下
  1. mikkoyue [ ~/c++/test ]$ g++ vtable.cpp -o vtable
  2. vtable.cpp: In constructor ‘cExt::cExt()’:
  3. vtable.cpp:19: 错误:类‘cExt’没有名为‘a’的字段
  4. mikkoyue [ ~/c++/test ]$
复制代码


把19行修改为“ cExt() {}”,又回到最初的错误
 楼主| 发表于 2008-6-2 12:00:02 | 显示全部楼层

这是没有行号的

  1. #include <iostream>

  2. using namespace std;

  3. class cBase1
  4. {
  5. public:
  6.     virtual void work();
  7.     cBase1() : a(0) {};
  8.     cBase1(int x) : a(x) {};
  9. protected:
  10.     int a;
  11. };

  12. class cExt : public cBase1
  13. {
  14. public:
  15.     virtual void work();
  16. //  cExt() : a(0){  };
  17. };

  18. void cBase1::work()
  19. {
  20.     cout << a << ": hello, word" << endl;
  21. }


  22. int main()
  23. {
  24.     cBase1 *p;
  25.     p = new cExt;

  26.     p->work();

  27.     delete p;

  28.     for ( int i = 1; i < 10; i++)
  29.     {
  30.         //if (i % 2 > 0)
  31.             p = new cBase1(i);
  32.         //else
  33.         //  p = new cExt(i);
  34.         p->work();
  35.         delete p;
  36.     }
  37. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-2 13:12:13 | 显示全部楼层

修改后的代码如下

  1. #include <iostream>

  2. using namespace std;

  3. class cBase1
  4. {
  5. public:
  6.         virtual void work();
  7.         cBase1() : a(0) {};
  8.         cBase1(const int x) : a(x) {};
  9. protected:
  10.         int a;
  11. };

  12. class cExt : public cBase1
  13. {
  14. public:
  15.         virtual void work();
  16.         cExt() {}
  17.         cExt(const int x) : cBase1(x) {}
  18. };

  19. void cBase1::work()
  20. {
  21.         cout << a << ": hello, word" << endl;
  22. }

  23. void cExt::work()
  24. {
  25.         cout << a << ": get away." << endl;
  26. }


  27. int main()
  28. {
  29.         cBase1 *p;
  30.         p = new cExt;

  31.         p->work();

  32.         delete p;

  33.         for ( int i = 1; i < 10; i++)
  34.         {
  35.                 if (i % 2 > 0)
  36.                         p = new cBase1(i);
  37.                 else
  38.                         p = new cExt(i);
  39.                 p->work();
  40.                 delete p;
  41.         }
  42. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表