Menu
Coddy logo textTech

Recapitulação: Hierarquia de Formas

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 32 de 61.

challenge icon

Desafio

Fácil

Vamos construir uma hierarquia de formas completa que demonstra o poder da herança via composição. Você criará um tipo base Shape do qual qualquer forma específica pode herdar e, em seguida, construirá um Rect que o estende.

Você organizará seu código em três arquivos:

  • shape.h: Defina sua hierarquia de structs com include guards. Crie uma struct Shape com um único campo color (um inteiro). Em seguida, defina uma struct Rect que incorpora Shape como seu primeiro membro e adiciona os campos width e height (ambos inteiros). Declare duas funções: set_color que recebe um Shape* e um novo valor de cor, e print_rect que recebe um Rect*.
  • shape.c: Implemente ambas as funções. Sua função set_color trabalha com o tipo base — ela modifica a cor de qualquer forma. Sua função print_rect exibe todas as informações do retângulo, incluindo sua cor herdada.
  • main.c: Crie um Rect e inicialize todos os seus campos. Em seguida, demonstre o upcasting chamando set_color com seu retângulo convertido para um Shape*. Por fim, imprima o retângulo para verificar se a cor foi alterada através do ponteiro do tipo base.

Você receberá quatro entradas: a largura (width) do retângulo, sua altura (height), uma cor inicial (initial color) e uma nova cor (new color) para definir através da função genérica.

No seu arquivo principal, crie o retângulo com os valores iniciais, use set_color para alterar sua cor para o novo valor (lembre-se de converter seu Rect* para Shape*) e, finalmente, chame print_rect para exibir o resultado.

Sua saída deve ser parecida com esta:

Width: 10
Height: 5
Color: 7

Onde 10 é a largura, 5 é a altura e 7 é a cor atualizada (não a cor inicial). O ponto fundamental aqui é que set_color não sabe nada sobre retângulos — ela funciona apenas com Shape. No entanto, através da regra do primeiro membro e do upcasting, a cor do seu retângulo é modificada por meio desta função genérica.

Experimente você mesmo

#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: Crie um Rect e inicialize todos os seus campos
    // (width, height e a cor da Shape incorporada com initial_color)
    
    // TODO: Chame set_color com o retângulo convertido para Shape*
    // para alterar a cor para new_color
    
    // TODO: Chame print_rect para exibir o resultado
    
    return 0;
}

Todas as lições de Object Oriented Programming