#include<iostream> using namespace std; class Shape { public: virtual double area() const = 0; //虚函数 }; class Circle :public Shape { public: Circle(double r) :radius(r)//初始化 { } virtual double area() const { return 3.14159 * radius * radiu
时间: 2023-12-15 09:28:37 浏览: 52
这段代码定义了一个抽象类Shape和它的一个派生类Circle,其中Shape类中定义了一个纯虚函数area(),表示面积,被定义为纯虚函数的函数在基类中没有实现,必须在派生类中实现。
Circle类继承自Shape类,表示一个圆形,其构造函数初始化了圆的半径。Circle类实现了Shape类中的虚函数area(),计算圆的面积并返回。
需要注意的是,由于Shape类中有一个纯虚函数,因此Shape类是一个抽象类,不能被实例化,只能被当作基类使用,由其派生出具体的子类。
这种使用抽象基类的方式可以实现多态,即通过基类指针或引用来调用派生类的方法,使得在运行时动态确定调用的方法,从而实现不同对象的统一处理。
相关问题
已知抽象类类Shape定义如下,其中两个纯虚函数分别为计算面积getArea()和计算周长getPerim()。请通过Shape类派生出矩形类Rectangle和圆类Circle,计算各自的面积和周长,并能够按照main函数给出的测试代码完成给定的输入。 ####Shape类定义及测试程序如下: #include <iostream> using namespace std; const double PI=3.14; class Shape { public: virtual double getArea()=0; virtual double getPerim()=0; }; /*请在这里输入你的代码*/ int main(){ double r,l,w; cin>>r; cin>>l>>w; Shape *p=NULL; p=new Circle(r); print(p);//输出圆面积与周长 p=new Rectangle(l,w); print(p);//输出矩形面积与周长 return 0; } 输入样例: 1 2 3 输出样例: Area:3.14 Perimeter:6.28 Area:6 Perimeter:10
请参考以下代码:
```c++
#include <iostream>
using namespace std;
const double PI=3.14;
class Shape {
public:
virtual double getArea()=0;
virtual double getPerim()=0;
};
class Circle : public Shape {
private:
double r;
public:
Circle(double r) : r(r) {}
double getArea() { return PI * r * r; }
double getPerim() { return 2 * PI * r; }
};
class Rectangle : public Shape {
private:
double l, w;
public:
Rectangle(double l, double w) : l(l), w(w) {}
double getArea() { return l * w; }
double getPerim() { return 2 * (l + w); }
};
void print(Shape *p) {
cout << "Area:" << p->getArea() << " ";
cout << "Perimeter:" << p->getPerim() << endl;
}
int main() {
double r, l, w;
cin >> r;
cin >> l >> w;
Shape *p = NULL;
p = new Circle(r);
print(p);
p = new Rectangle(l, w);
print(p);
return 0;
}
```
运行结果:
输入:
1 2 3
输出:
Area:3.14 Perimeter:6.28
Area:6 Perimeter:10
#include<iostream> using namespace std; class Shape { public: virtual double area() const=0; }; class Circle:public Shape { public: Circle(double r):radius(r) { } virtual double area() const { return 3.14159*radius*radius; } protected: double radius; }; class Square:public Shape { public: Square(double s):side(s) { } virtual double area() const { return side*side; } protected: double side; }; class Rectangle:public Shape { public: Rectangle(double w,double h):width(w),height(h) { } virtual double area() const { return width*height; } protected: double width,height; }; class Trapezoid:public Shape { public: Trapezoid(double t,double b,double h):top(t),bottom(b),height(h) { } virtual double area() const { return 0.5*(top+bottom)*height; } protected: double top,bottom,height; }; class Triangle:public Shape { public: Triangle(double w,double h):width(w),height(h) { } virtual double area() const { return 0.5*width*height; } protected: double width,height; }; int main() { Circle circle(12.6); Square square(3.5); Rectangle rectangle(4.5,8.4); Trapezoid trapezoid(2.0,4.5,3.2); Triangle triangle(4.5,8.4); Shape *pt[5]= { &circle,&square,&rectangle,&trapezoid,&triangle }; double areas=0.0; for(int i=0; i<5; i++) { areas=areas+pt[i]->area(); } cout<<"total of all areas="<<areas<<endl; return 0; }这段代码若要输出Circle:498.51 Square:12.25 Rectangle:37.80 Trapezoid:10.40 Triangle:18.90,如何改进
可以将输出语句放在循环中,分别输出每个图形的面积。可以在每个 Shape 类的子类中添加一个成员函数,用于返回该图形的名称,然后在输出语句中使用该函数获取图形名称。代码如下:
```
#include<iostream>
using namespace std;
class Shape {
public:
virtual double area() const = 0;
virtual string name() const = 0; // 添加获取图形名称的函数
};
class Circle : public Shape {
public:
Circle(double r) : radius(r) {}
virtual double area() const {
return 3.14159 * radius * radius;
}
virtual string name() const { // 返回图形名称
return "Circle";
}
protected:
double radius;
};
class Square : public Shape {
public:
Square(double s) : side(s) {}
virtual double area() const {
return side * side;
}
virtual string name() const {
return "Square";
}
protected:
double side;
};
class Rectangle : public Shape {
public:
Rectangle(double w, double h) : width(w), height(h) {}
virtual double area() const {
return width * height;
}
virtual string name() const {
return "Rectangle";
}
protected:
double width, height;
};
class Trapezoid : public Shape {
public:
Trapezoid(double t, double b, double h) : top(t), bottom(b), height(h) {}
virtual double area() const {
return 0.5 * (top + bottom) * height;
}
virtual string name() const {
return "Trapezoid";
}
protected:
double top, bottom, height;
};
class Triangle : public Shape {
public:
Triangle(double w, double h) : width(w), height(h) {}
virtual double area() const {
return 0.5 * width * height;
}
virtual string name() const {
return "Triangle";
}
protected:
double width, height;
};
int main() {
Circle circle(12.6);
Square square(3.5);
Rectangle rectangle(4.5, 8.4);
Trapezoid trapezoid(2.0, 4.5, 3.2);
Triangle triangle(4.5, 8.4);
Shape* pt[] = { &circle,&square,&rectangle,&trapezoid,&triangle };
double areas = 0.0;
for (int i = 0; i < 5; i++) {
cout << pt[i]->name() << ":" << pt[i]->area() << " "; // 输出图形名称和面积
areas += pt[i]->area();
}
cout << endl << "total of all areas=" << areas << endl;
return 0;
}
```