📊 Capítulo 11: Herança, Polimorfismo & vtable
Especialização em Sistemas com C++
🗺️ Como Funciona o Despacho Dinâmico: A Tabela Virtual (vtable)
flowchart LR
subgraph OBJ ["Objeto em Memória: Circulo"]
VPTR["vptr (Ponteiro oculto de 8 bytes injetado pelo compilador)"]
DATA["double raio_ = 5.0"]
end
subgraph VTABLE ["vtable de Circulo (Tabela em Memória de Leitura)"]
SLOT1["&Circulo::desenhar()"]
SLOT2["&Circulo::area()"]
SLOT3["&Circulo::~Circulo()"]
end
VPTR --> |"Aponta para"| VTABLE
SLOT2 --> CODE["Instruções Assembly de Circulo::area() ⚡"]
style OBJ fill:#ede7f6,stroke:#512da8,stroke-width:2px
style VPTR fill:#fff3e0,stroke:#ff9800,stroke-width:1.5px
style DATA fill:#e1f5fe,stroke:#03a9f4,stroke-width:1.5px
style VTABLE fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style SLOT2 fill:#c8e6c9,stroke:#2e7d32,stroke-width:1.5px
style CODE fill:#00897b,stroke:#004d40,stroke-width:2px,color:#ffffff
🎯 Slide 1: Classes Base com Destrutores Virtuais
-
Regra de Ouro: Se uma classe tem qualquer método
virtual, o seu destrutor DEVE servirtual!
class Base {
public:
virtual ~Base() = default; // Essencial para evitar Undefined Behavior ao deletar via ponteiro base!
};
🎯 Slide 2: Interfaces Puras em C++ (= 0)
- Métodos com
= 0tornam a classe abstrata (não instanciável):
class IRenderizavel {
public:
virtual ~IRenderizavel() = default;
virtual void renderizar() const = 0; // Pure virtual method
};
🎯 Slide 3: Os Especificadores override e final
override: Evita erros silenciosos se a assinatura do método na classe filha for ligeiramente diferente da classe pai.final: Impede novas heranças ou sobrescritas futuras.
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim