#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 13:28:37 浏览: 169
这段代码定义了一个抽象类Shape和它的一个派生类Circle,其中Shape类中定义了一个纯虚函数area(),表示面积,被定义为纯虚函数的函数在基类中没有实现,必须在派生类中实现。
Circle类继承自Shape类,表示一个圆形,其构造函数初始化了圆的半径。Circle类实现了Shape类中的虚函数area(),计算圆的面积并返回。
需要注意的是,由于Shape类中有一个纯虚函数,因此Shape类是一个抽象类,不能被实例化,只能被当作基类使用,由其派生出具体的子类。
这种使用抽象基类的方式可以实现多态,即通过基类指针或引用来调用派生类的方法,使得在运行时动态确定调用的方法,从而实现不同对象的统一处理。
相关问题
#include <iostream> using namespace std; //定义抽象基类Shape class Shape { public: virtual double area() const = 0; //纯虚函数 }; //定义Circle(圆形)类 class Circle :public Shape { public: Circle(double r) :radius(r) {} //结构函数 virtual double area() const { return 3.14159 * radius * radius; }; //定义虚函数 protected: double radius; //半径 }; //定义Square(正方形)类 class Square :public Shape { public: Square(double s) :side(s) {} //结构函数 virtual double area() const { return side * side; } //定义虚函数 protected: double side; }; //定义Rectangle(矩形)类 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; //宽与高 }; //定义Trapezoid(梯形)类 class Trapezoid :public Shape { public: Trapezoid(double t, double b, double h) :top(t), bottom(t), height(h) {} //结构函数 virtual double area() const { return 0.5 * (top + bottom) * height; } //定义虚函数 protected: double top, bottom, height; //上底、下底与高 }; //定义Triangle(三角形)类 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); //建立Circle类对象circle Square square(3.5); //建立Square类对象square Rectangle rectangle(4.5, 8.4); //建立Rectangle类对象rectangle Trapezoid trapezoid(2.0, 4.5, 3.2); //建立Trapezoid类对象trapezoid Triangle triangle(4.5, 8.4); //建立Triangle类对象 Shape* pt[5] = { &circle,&square,&rectangle,&trapezoid,&triangle }; //定义基类指针数组pt,使它每一个元素指向一个派生类对象 double areas = 0.0; //areas为总面积 for (int i = 0; i< 5; i++) { areas = areas + pt[i]->area(); } cout<< "totol of all areas=" << areas <<endl; //输出总面积 return 0; } 根据该程序写出大致流程步骤
1. 定义抽象基类Shape,其中包括一个纯虚函数area()。
2. 定义5个派生类,分别是Circle(圆形)类、Square(正方形)类、Rectangle(矩形)类、Trapezoid(梯形)类和Triangle(三角形)类。这些派生类都继承自Shape基类,并且实现了area()纯虚函数。
3. 在主函数中,分别建立了Circle、Square、Rectangle、Trapezoid和Triangle对象,并使用基类指针数组pt,将这些对象的地址存储下来。
4. 通过for循环,遍历基类指针数组pt中的所有元素,依次调用它们的area()函数,并将返回值累加到变量areas中。
5. 输出总面积。
已知抽象类类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
阅读全文