鱼C论坛

 找回密码
 立即注册
查看: 3900|回复: 3

C++中虚函数的错误

[复制链接]
发表于 2012-12-16 21:56:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 longdeqidao 于 2012-12-16 21:58 编辑
  1. //已经习惯类名第一个字母大写,所以改了一下类名
  2. #include <iostream>

  3. using namespace std;
  4. /*
  5. *这个类中,给的例子中是纯虚函数,但是在主函数中Square s(3);
  6. *出现了cannot declare variable 's' to be of abstract type 'Square'|的错误
  7. *所以我改了一下不是纯虚函数,就通过。测试答案是正确的,这点我没有搞懂原因
  8. *之后我分别改变Area和SetData为虚函数,发现Area为纯虚函数没有错误,而SetData就有
  9. *所有现在的源代码就是能通过的状态,这一点我没有搞懂。
  10. *我估计是Square,Circle类中得SetData参数个数与基类不同造成的。望高手解答。
  11. */
  12. class Shape
  13. {
  14. public:
  15.     virtual float Area() = 0;               //纯虚函数
  16.     virtual void SetData(float,float){};    /*非纯虚函数,纯虚函数应为virtual void SetData(float,float) = 0;但出现上述错误*/
  17. };

  18. class Triangle: public Shape
  19. {
  20. public:
  21.     Triangle(float ww=0,float hh=0) {
  22.         w=ww;
  23.         h=hh;
  24.     }
  25.     virtual float Area() {
  26.         return w*h/2;
  27.     }
  28.     virtual void SetData(float ww,float hh) {
  29.         w=ww;
  30.         h=hh;
  31.     }
  32. private:
  33.     float w,h;
  34. };

  35. class Rectangle: public Shape {
  36. public:
  37.     Rectangle(float ww, float hh): w(ww), h(hh){}
  38.     virtual float Area() {
  39.         return w * h;
  40.     }
  41.     virtual void SetData(float ww, float hh) {
  42.         w = ww;
  43.         h = hh;
  44.     }
  45. private:
  46.     float w;
  47.     float h;
  48. };

  49. class Square: public Shape {
  50. public:
  51.     Square(float ss): s(ss){}
  52.     virtual float Area() {
  53.         return s * s;
  54.     }
  55.     void SetData(float ss){     //此处应不需要虚函数,因为函数个数不同
  56.         s = ss;
  57.     }
  58. private:
  59.     float s;
  60. };

  61. class Circle: public Shape {
  62. public:
  63.     Circle(float rr): r(rr){}
  64.     virtual float Area(){
  65.         return 3.1415 * r * r;
  66.     }
  67.     void SetData(float rr){     //此处应不需要虚函数,因为函数个数不同
  68.         r = rr;
  69.     }
  70. private:
  71.     float r;
  72. };

  73. float CaclArea(Shape *s)
  74. {
  75.     return s->Area();
  76. }

  77. int main()
  78. {
  79.     Triangle    t(2, 4);
  80.     Rectangle   r(2, 4);
  81.     Square      s(3);
  82.     Circle      c(3);
  83.     Shape       *pt = &t, *pr = &r;
  84.     Shape       *ps = &s, *pc = &c;
  85.     double sum;

  86.     sum = CaclArea(pt) + CaclArea(pr) +
  87.           CaclArea(ps) + CaclArea(pc);
  88.     cout << sum  << endl;

  89.     return 0;
  90. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-17 12:08:22 | 显示全部楼层
纯虚函数的继承如果不进行定义 那么继承下来的类也是虚类 要想解决必须在square中对从shape中继承下来的SetData进行定义 因为纯虚函数中带两个参数 而你的square中是一个参数 二者不是同一个函数 所以还需要对带两个参数的SetData(float,float)函数进行定义才行 否则square也是虚基类
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-12-17 17:31:38 | 显示全部楼层

可不可以定义一个SetData(float, float){}在重载一个SetData(float)  便于设置值
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-12-17 19:30:42 | 显示全部楼层
可以  不过SetData(float, float){} 必须进行定义
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-14 09:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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