多态用法
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 47 课,共 61 课。
挑战
简单让我们编写一个函数,通过基类 Shape* 指针处理任何形状,无论它是 Circle 还是 Rectangle,以此证明多态确实有效。
在现有的 Circle 和 Rectangle 实现基础上,你将添加一个强大的抽象:一个可以统一处理任意形状类型的函数。
你的项目将包含以下文件:
shape.h:基类Shape接口,以及DrawFunc和AreaFunc类型。circle.h和circle.c:上一课中的 Circle 实现。rectangle.h和rectangle.c:上一课中的 Rectangle 实现。shape.c:实现一个名为process_shape的新函数,它接受一个Shape*指针。这个函数应调用形状的draw函数,然后调用它的area函数,并按Area: X.XX的格式打印结果,保留 2 位小数。main.c:演示多态的实际效果。读取一个形状类型标记(圆形用c,矩形用r),然后读取所需的尺寸。创建对应的形状,再将指向其嵌入的Shape成员的指针传递给process_shape。同一个函数可以处理这两种类型!
你的程序将接收以下输入之一:
c,后跟一个半径值;或r,后跟宽度和高度值
输入为 c 和 5.0 时的输出示例:
Drawing Circle with radius: 5.00
Area: 78.54输入为 r、4.0 和 3.0 时的输出示例:
Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00这里的关键在于,process_shape 无法判断自己处理的是 Circle 还是 Rectangle。它只了解 Shape 接口。将具体形状中嵌入的 Shape 成员转换为 Shape*,就可以把任意形状类型传递给这个单一函数。这就是多态:一个函数,根据实际对象类型呈现多种行为。
记得在 shape.h 中声明 process_shape,这样就能从 main.c 中调用它。
亲手试试
#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"
int main() {
// TODO:读取一个表示形状类型的字符('c' 表示圆形,'r' 表示矩形)
// TODO:如果是 'c',读取半径,创建一个 Circle,并将其基类部分传给 process_shape
// TODO:如果是 'r',读取宽度和高度,创建一个 Rectangle,并将其基类部分传给 process_shape
return 0;
}
面向对象编程中的所有课
自己练习: C 在线编译器