练习2.采用虚函数实现如下程序: 定义一个点类,类中有私有的数据成 员x, y,公有的成员函数有参构造函 数,无参构造函数,计算点面积的 area函数。 定义—个圆类,圆类公有继承点类, 类中新增私有的数据成员半径r,类中 有公有的成员函数,有参构造函数, 无参构造函数,计算圆面积的area函 数。 2 在main函数中创建一个点类的对象, 一个圆类的对象,定义基类的指针, 分别调用点类和圆类的area方法,观 察动态多态。
时间: 2023-09-11 14:05:54 浏览: 83
下面是使用虚函数实现上述程序的代码:
```cpp
#include <iostream>
using namespace std;
class Point {
protected:
double x, y;
public:
Point(double x = 0, double y = 0): x(x), y(y) {}
virtual double area() { return 0; }
};
class Circle : public Point {
private:
double r;
public:
Circle(double x = 0, double y = 0, double r = 0): Point(x, y), r(r) {}
double area() { return 3.14 * r * r; }
};
int main() {
Point *p1 = new Point(1, 2);
Circle *c1 = new Circle(3, 4, 5);
Point *p2 = c1;
cout << p1->area() << endl; // 输出0,调用Point类中的area方法
cout << c1->area() << endl; // 输出78.5,调用Circle类中的area方法
cout << p2->area() << endl; // 输出78.5,调用Circle类中的area方法
delete p1;
delete c1;
return 0;
}
```
在上述代码中,我们定义了一个基类`Point`和一个派生类`Circle`,`Circle`类继承了`Point`类的所有成员(包括构造函数),并新增了一个私有的数据成员`r`,以及一个计算圆面积的方法`area`。
在`Point`类中,我们使用了虚函数`area`,这样在调用`area`方法时就可以根据实际的对象类型来决定调用哪个类的`area`方法,实现了多态。
在`main`函数中,我们创建了一个`Point`类的对象`p1`和一个`Circle`类的对象`c1`,并将`c1`赋值给`Point`类的指针`p2`。然后我们分别调用了`p1`、`c1`和`p2`的`area`方法,观察到调用的方法分别是`Point`类和`Circle`类中的`area`方法,证明了动态多态的实现。最后别忘了释放内存。
阅读全文