Menu
Coddy logo textTech

Incorporação de Structs

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 precisar 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 embutida
    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 à herança.

Para acessar os membros do pai por meio de uma instância 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 a construção de 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 na qual um Employee contém um Person. Isso representa como a herança funciona: um funcionário “é um” 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 ambas as structs aqui, com proteções contra inclusão múltipla. Primeiro, crie uma struct Person com dois campos: name (um array de caracteres com 50 caracteres) e age (um inteiro). Em seguida, defina uma struct Employee que incorpora Person como seu primeiro membro e adiciona um campo employee_id (um inteiro).
  • types.c: Implemente uma função chamada print_employee que recebe um ponteiro para um Employee e exibe 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), sua idade (um inteiro) e seu ID de 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 de funcionário fornecido nas entradas.

Lembre-se de acessar os membros da struct incorporada por meio do membro pai; por exemplo, para chegar ao nome, você navegará primeiro pelo membro person.

Experimente você mesmo

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

int main() {
    // Ler entrada
    char name[50];
    int age;
    int employee_id;
    
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // Remover nova linha
    scanf("%d", &age);
    scanf("%d", &employee_id);
    
    // TODO: Crie uma variável Employee
    
    // TODO: Preencha o nome e a idade da pessoa embutida
    // Dica: Use strcpy para o nome, acesse com employee.person.name
    
    // TODO: Defina o employee_id
    
    // TODO: Chame print_employee com um ponteiro para o seu employee
    
    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