我收到一条错误消息"分配一个抽象类类型的对象' 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中构造函数的问题吗?我不确定,有点迷失。在这一点上,任何我应该研究以找到答案的提示都会很棒。
谢谢!
答案 0 :(得分:0)
getArea
和getPerimeter
的签名与基类的签名不同。使用相同的签名,否则你只是隐藏基本方法,而不是覆盖它们。
您无需传递尺寸,您已将它们作为成员传递。
答案 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