Menu
CoddyTech

回顾:形状层次结构

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 32 课,共 61 课。

challenge icon

挑战

简单

让我们构建一个完整的形状层次结构,通过组合来展示继承的强大之处。你将创建一个基础 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 在线编译器