分配抽象 class 类型 'Shape' 的对象?

Allocating an object of abstract class type 'Shape'?

我收到一条错误消息 "Allocating an object of abstract class type 'Shape'"。圆(双r):形状("Circle").

#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(){

}

这是ClassCircle/Square中构造函数的问题吗?我不确定,有点迷茫。在这一点上,任何关于我应该研究什么来找到答案的提示都会很棒。

谢谢!

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

您不需要传入维度,您已经将它们作为成员。

回答你的问题:

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

但是您的代码中存在一些问题,这里有一些提示: 使用 member initialization list,使用 std::string(不是 char*),使用 const 正确性,不要重新发明轮子 使用 M_PI from <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
6.28319 3.14159