下列Shape类是一个表示形状的抽象类,类内的成员函数volume为求立体图形体积的函数,成员函数show为显示立体图形信息的函数。total则是一个普通的用以求不同立体图形的体积总和的函数。 class Shape // 抽象形状类 {public: virtual double volume( )=0; // 纯虚函数 virtual void show( )=0; // 纯虚函数 }; double total(Shape *s[], int n){ …… }
class Shape // 抽象形状类 {public: virtual double volume( )=0; // 纯虚函数 virtual void show( )=0; // 纯虚函数 };
double total(Shape* s[], int n) {.......}
要求:
- (1)从Shape类派生立方体类(Cube)、球类(Sphere),并给出具体的求体积函数和显示图形信息的函数。
- (2)写出total函数的函数体。
一、代码整体结构
- 类的定义:
Shape
类:一个抽象类,包含两个纯虚函数volume()
和show()
,作为基类为派生类提供接口。Cube
类:继承自Shape
类,用于表示长方体,包含私有成员变量length
、width
和height
,并实现了Shape
类中的纯虚函数,提供了设置长方体边长的成员函数和构造函数。Sphere
类:继承自Shape
类,用于表示球体,包含私有成员变量radius
,并实现了Shape
类中的纯虚函数,提供了设置球体半径的成员函数和构造函数。
- 函数定义:
total()
函数:接受一个Shape
指针数组s
和数组元素个数n
,通过遍历数组调用每个元素的volume()
函数并累加结果,计算体积总和。main()
函数:创建了Cube
和Sphere
的对象,调用它们的show()
函数显示对象信息,将它们的指针存储在Shape
指针数组中,并调用total()
函数计算体积总和。
二、详细分析
- Shape 类:
- 纯虚函数的使用使得
Shape
类成为抽象类,不能实例化,主要目的是为派生类提供接口,确保派生类实现volume()
和show()
函数。 - 这是一种多态性的体现,不同的派生类可以有不同的
volume()
和show()
实现。
- 纯虚函数的使用使得
- Cube 类:
- 构造函数
Cube(double l, double w, double h)
:用于初始化长方体的长、宽、高。 setL(double L)
、setW(double W)
、setH(double H)
:用于修改长方体的长、宽、高。show()
:输出长方体的长、宽、高和体积。volume()
:根据长方体体积公式V = l * w * h
计算体积。
- 构造函数
- Sphere 类:
- 构造函数
Sphere(double r)
:用于初始化球体的半径。 setR(double r)
:用于修改球体的半径。show()
:输出球体的半径和体积。volume()
:根据球体体积公式V = 4/3 * π * r^3
计算体积,但代码中没有使用π
,计算结果不准确,正确的计算应该是return 4.0 / 3.0 * 3.1415926 * radius * radius * radius;
。
- 构造函数
- total 函数:
- 接受一个
Shape
指针数组,通过多态性调用每个元素的volume()
函数,并将结果累加到sum
中。 - 该函数的存在是为了方便计算多个不同形状对象的体积总和。
- 接受一个
- main 函数:
- 创建
Cube
对象c
并调用show()
函数,展示长方体信息。 - 创建
Sphere
对象s
并调用show()
函数,展示球体信息。 - 将
c
和s
的指针存储在Shape
指针数组p
中,调用total()
函数计算它们的体积总和。
- 创建
#include<iostream>
using namespace std;
class Shape // 抽象形状类
{public:
virtual double volume( )=0; // 纯虚函数
virtual void show( )=0; // 纯虚函数
};
class Cube : public Shape
{
public:
Cube(double l, double w, double h);
void setL(double L);
void setW(double W);
void setH(double H);
void show();
double volume();
private:
double length, width, height;
};
Cube::Cube(double l, double w, double h) { length = l; width = w; height = h; }
void Cube::setL(double l) { length = l; }
void Cube::setW(double w) { width = w; }
void Cube::setH(double h) { height = h; }
double Cube::volume() { return length * width * height; }
void Cube::show()
{
cout << "length = " << length << ", width = " << width << ", height = " << height << endl;
cout << "volume = " << volume() << endl;
}
class Sphere : public Shape
{
public:
Sphere(double r);
void setR(double r);
void show();
double volume();
private:
double radius;
};
Sphere::Sphere(double r) { radius = r; }
void Sphere::setR(double r) { radius = r; }
void Sphere::show()
{
cout << "radius = " << radius << endl;
cout << "volume = " << volume() << endl;
}
double Sphere::volume() { return radius * radius * radius * 4.0 / 3.0; }
double total(Shape* s[], int n)
{
double sum = 0;
for (int i = 0; i < n; i++) { sum += s[i]->volume(); }
return sum;
}
int main()
{
Cube c(2, 3, 4);
cout << "长方体信息为 :" << endl;
c.show();
Sphere s(5);
cout << "球体信息为 :" << endl;
s.show();
Shape* p[2] = { &c, &s };
cout << "体积总和是:" << total(p, 2) << endl;
return 0;
}