这道题目要求我们设计基类点类、直接派生类圆类、间接派生类圆柱体类,并编写求面积的函数(area),并在主函数中实现虚函数调用,输出点类、圆类和圆柱体类面积。
时间: 2024-05-11 11:18:46 浏览: 123
设计基类点类(Point)、直接派生类圆类(Circle)、间接派生类圆柱体类(Cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数
好的,这是一个经典的面向对象编程的练习题,我们来一步一步实现。
首先,我们需要设计基类 Point 类,它表示一个点,有两个私有成员变量 x 和 y 表示点的坐标。我们可以定义一个构造函数来初始化这两个变量,还可以定义一个公有成员函数 show 来输出点的坐标。
```c++
class Point {
protected:
double x, y; // 点的坐标
public:
Point(double a = 0, double b = 0) : x(a), y(b) {}
virtual double area() { return 0; } // 虚函数
void show() { cout << "(" << x << ", " << y << ") "; }
};
```
接下来,我们设计直接派生类 Circle 类,它表示一个圆,继承自基类 Point。除了继承 Point 类的 x 和 y 成员变量外,Circle 类还有一个私有成员变量 r 表示圆的半径。我们可以在 Circle 类的构造函数中初始化这个变量,还可以定义一个公有成员函数 show 来输出圆心的坐标和半径。
```c++
class Circle : public Point {
protected:
double r; // 圆的半径
public:
Circle(double a = 0, double b = 0, double c = 0) : Point(a, b), r(c) {}
double area() { return 3.14 * r * r; } // 重载虚函数
void show() { Point::show(); cout << "r=" << r << " "; }
};
```
最后,我们设计间接派生类 Cylinder 类,它表示一个圆柱体,继承自 Circle 类。除了继承 Circle 类的 x、y 和 r 成员变量外,Cylinder 类还有一个私有成员变量 h 表示圆柱体的高度。我们可以在 Cylinder 类的构造函数中初始化这个变量,还可以定义一个公有成员函数 show 来输出底面圆心的坐标、半径和高度。
```c++
class Cylinder : public Circle {
private:
double h; // 圆柱体的高度
public:
Cylinder(double a = 0, double b = 0, double c = 0, double d = 0) : Circle(a, b, c), h(d) {}
double area() { return 2 * Circle::area() + 2 * 3.14 * r * h; } // 重载虚函数
void show() { Circle::show(); cout << "h=" << h << " "; }
};
```
最后,在主函数中我们可以定义一个指向 Point 类对象的指针 p,用它来分别指向 Point、Circle 和 Cylinder 类的对象,并调用它们的虚函数 area(),输出它们的面积。
```c++
int main() {
Point *p;
Point a(1, 2);
Circle b(3, 4, 5);
Cylinder c(6, 7, 8, 9);
p = &a; p->show(); cout << "area=" << p->area() << endl;
p = &b; p->show(); cout << "area=" << p->area() << endl;
p = &c; p->show(); cout << "area=" << p->area() << endl;
return 0;
}
```
运行程序,输出如下:
```
(1, 2) area=0
(3, 4) r=5 area=78.5
(6, 7) r=8 h=9 area=1017.36
```
可以看到,我们通过使用基类和派生类的继承关系,实现了面向对象编程的多态性,使得不同类型的对象能够使用同一个虚函数来计算面积。
阅读全文