分配抽象类类型的对象' Shape&#39 ;?

时间:2015-11-21 01:59:00

标签: c++ class abstract pure-virtual

我收到一条错误消息"分配一个抽象类类型的对象' Shape'"。圆(双r):形状("圆")。

#include <iostream>
using namespace std;

class Shape{
    char name[20];
    Shape(char *){};
    virtual double getPerimeter()=0;
    virtual double getArea()=0;
};

class Circle : public Shape{
    double rad;
    static const double PI;
public:
    Circle(double r):Shape("Circle"){
        rad = r;
    }
    double getRadius(){
        return rad;
    }
    double getPerimeter(double rad){
        return 2 * PI * rad;
    }
    double getArea(double rad){
        return PI * (rad * rad);
    }
};

class Square : public Shape{
    double side;
public:
    Square(double s):Shape("Square"){
        side = s;
    }
    double getPerimeter(double side){
        return side * 4;
    }
    double getArea(double side){
        return side * side;
    }

};

const double Circle::PI = 3.1415;

int main(){

}

这是Class Circle / Square中构造函数的问题吗?我不确定,有点迷失。在这一点上,任何我应该研究以找到答案的提示都会很棒。

谢谢!

2 个答案:

答案 0 :(得分:0)

getAreagetPerimeter的签名与基类的签名不同。使用相同的签名,否则你只是隐藏基本方法,而不是覆盖它们。

您无需传递尺寸,您已将它们作为成员传递。

答案 1 :(得分:0)

回答你的问题:

您的构造函数Shape(char *){};是私有的。您不能在派生类中重用它。

但是你的代码中有几个问题,这里有一些提示: 使用member initialization list,使用std::string(不是char *),使用const正确性,不要重新使用来自M_PI的轮<cmath>

一个有效且更好的代码:

#include <iostream>
#include <string>
#include <cmath>

class Shape {
public:
  Shape(std::string n) : name(n) {}
  // virtual double getPerimeter() const = 0;
  virtual double getArea() const = 0;
protected:
  std::string name;
};

class Circle : public Shape {
public:
  Circle(double r) : Shape("Circle"), rad(r) {}
  double getPerimeter() const { return  2 * M_PI * rad; }
  double getArea() const { return M_PI * rad * rad; } ;
private:
  double rad;
};

class Square : public Shape {
public:
  Square(double s) : Shape("Square"), side(s) {}
  double getPerimeter() const { return  4 * side; }
  double getArea() const { return side * side; } ;
private:
  double side;
};

int main() {
    Square square(4.0);
    std::cout << square.getPerimeter() << " " << square.getArea() << '\n';
    Circle circle(1.0);
     std::cout << circle.getPerimeter() << " " << circle.getArea() << '\n';
}

输出:

  16 16 16   6.28319 3.14159