Polimorfismo e tabelas de funções
Polimorfismo dinâmico permite chamada comum implementada pelo tipo concreto.
O que é Polimorfismo e tabelas de funções?
Polimorfismo dinâmico permite chamada comum implementada pelo tipo concreto.
Escolha comportamento por interface comum.
Pontos importantes
- Entenda primeiro o mecanismo em C.
- Use RAII e semântica de valor para ownership.
- Prefira abstrações type-safe a macros e casts.
Exemplos de código C e C++
main.c
#include <stdio.h>
typedef struct Shape Shape;
struct Shape {
double value;
double (*area)(const Shape *shape);
};
double square_area(const Shape *shape) {
return shape->value * shape->value;
}
int main(void) {
Shape square = {4.0, square_area};
printf("area=%.1f\n", square.area(&square));
}
area=16.0
C++
main.cpp
#include <iostream>
struct Shape {
virtual double area() const = 0;
virtual ~Shape() = default;
};
struct Square : Shape {
double side;
explicit Square(double value) : side(value) {}
double area() const override { return side * side; }
};
int main() {
Square square(4);
const Shape& shape = square;
std::cout << "area=" << shape.area() << '\n';
}
area=16
Comparação entre C e C++
C constrói ponteiro e function table; virtual C++ gera dispatch semelhante e destrutor virtual seguro.
C
C usa prefixos, callbacks, macros e contextos explícitos.
C++
O idioma fornece abstrações com escopo, type-safe e de baixo custo.
Exercícios práticos
Execute as duas versões e modifique-as para observar suas garantias.
- Escreva primeiro o mecanismo em C.
- Substitua cleanup manual por RAII.
- Meça alocações e dispatch virtual.