Menu
CoddyTech

Incorporação de struct

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 28 de 61.

Em linguagens orientadas a objetos como C++ ou Java, a herança permite que uma classe adquira propriedades de uma classe pai. C não tem herança integrada, mas podemos simulá-la usando uma técnica chamada composição: colocar uma struct dentro de outra.

A ideia é simples: se um Child precisa de todas as propriedades de um Parent, incorporamos a struct Parent como membro de Child.

typedef struct {
    int id;
    char name[50];
} Parent;

typedef struct {
    Parent parent;  // Struct incorporada
    int grade;
} Child;

Aqui, Child contém tudo o que Parent tem, além de seu próprio campo grade. Isso é composição: o filho “tem um” pai, em vez de “ser um” pai, mas o efeito é semelhante ao da herança.

Para acessar os membros da classe pai por meio de uma instância da classe filha, você usa o operador ponto duas vezes:

Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;

Esse padrão forma a base para construir hierarquias de tipos em C. Ao incorporar uma struct base como o primeiro membro, desbloqueamos técnicas poderosas que exploraremos nas próximas lições.

challenge icon

Desafio

Fácil

Vamos criar um sistema simples de gerenciamento de funcionários que demonstra a incorporação de structs: a base da herança em C.

Você criará uma hierarquia em que um Employee contém um Person. Isso reflete como a herança funciona: um funcionário “é uma” pessoa com informações adicionais relacionadas ao trabalho. Ao incorporar a struct Person dentro de Employee, você obtém todas as propriedades da pessoa, além dos campos específicos do funcionário.

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

  • types.h: Defina as duas structs aqui, com guardas de inclusão. Primeiro, crie uma struct Person com dois campos: name (um array de caracteres com 50 caracteres) e age (um inteiro). Depois, defina uma struct Employee que incorpore Person como seu primeiro membro e adicione um campo employee_id (um inteiro).
  • types.c: Implemente uma função chamada print_employee que recebe um ponteiro para um Employee e imprime suas informações. Acesse os dados da pessoa incorporada usando a sintaxe encadeada de ponto/seta que você aprendeu.
  • main.c: Crie uma variável Employee, preencha todos os seus campos (incluindo o nome e a idade da pessoa incorporada) e use sua função de impressão para exibir as informações.

Você receberá três entradas: o nome do funcionário (uma string), a idade (um inteiro) e o ID do funcionário (um inteiro).

Sua função print_employee deve exibir as informações do funcionário neste formato:

Employee: Alice
Age: 28
ID: 1001

Onde Alice é o nome, 28 é a idade e 1001 é o ID do funcionário fornecido nas entradas.

Lembre-se de acessar os membros da struct incorporada por meio do membro pai. Por exemplo, para acessar o nome, você passará primeiro pelo membro person.

Experimente você mesmo

#include <stdio.h>
#include <string.h>
#include "types.h"

int main() {
    // Leia a entrada
    char name[50];
    int age;
    int employee_id;
    
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // Remova a quebra de linha
    scanf("%d", &age);
    scanf("%d", &employee_id);
    
    // TODO: Crie uma variável do tipo Employee
    
    // TODO: Preencha o nome e a idade da pessoa incorporada
    // Dica: Use strcpy para o nome; acesse-o com employee.person.name
    
    // TODO: Defina employee_id
    
    // TODO: Chame print_employee com um ponteiro para seu empregado
    
    return 0;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online