回顾:形状层次结构
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 32 课,共 61 课。
挑战
简单让我们构建一个完整的形状层次结构,通过组合来展示继承的强大之处。你将创建一个基础 Shape 类型,供各种具体形状继承,然后创建一个扩展它的 Rect。
你将把代码分成三个文件:
shape.h:使用头文件保护定义结构体层次结构。创建一个只有一个color字段(整数)的Shape结构体。然后定义一个Rect结构体,将Shape嵌入为第一个成员,并添加width和height字段(都是整数)。声明两个函数:set_color,它接收一个Shape*和一个新的颜色值;以及print_rect,它接收一个Rect*。shape.c:实现这两个函数。你的set_color函数使用基础类型,可以修改任意形状的颜色。你的print_rect函数会显示矩形的所有信息,包括继承的颜色。main.c:创建一个Rect并初始化它的所有字段。然后,将矩形转换为Shape*并传给set_color,以此演示向上转型。最后,打印矩形,确认颜色已通过基础类型指针修改。
你会收到四个输入:矩形的宽度、高度、初始颜色,以及要通过通用函数设置的新颜色。
在主文件中,使用初始值创建矩形,然后使用 set_color 将其颜色改为新值(记得将 Rect* 转换为 Shape*),最后调用 print_rect 显示结果。
输出应如下所示:
Width: 10
Height: 5
Color: 7其中,10 是宽度,5 是高度,7 是更新后的颜色(不是初始颜色)。这里的关键在于,set_color 并不了解矩形,它只处理 Shape。不过,由于第一个成员规则和向上转型,你的矩形颜色仍能通过这个通用函数修改。
亲手试试
#include <stdio.h>
#include "shape.h"
int main() {
int width, height, initial_color, new_color;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &initial_color);
scanf("%d", &new_color);
// TODO: 创建一个 Rect,并初始化它的所有字段
// (width、height,以及用 initial_color 初始化嵌入的 Shape 的 color 字段)
// TODO: 将矩形转换为 Shape* 后,调用 set_color
// 把颜色改为 new_color
// TODO: 调用 print_rect 显示结果
return 0;
}
面向对象编程中的所有课
自己练习: C 在线编译器