Herança e polimorfismo
Substituição, acesso, construção, funções virtuais, classes abstratas, slicing e destrutores virtuais.
Referência ou cópia?
Promocao promocao(100.0, 0.25);
const Produto& referencia = promocao; // total() = 75
Produto copia = promocao; // total() = 100, só a base
- Tipo estático vem da declaração. Tipo dinâmico é o objeto concreto.
- Virtual por referência ou apontador escolhe pelo tipo dinâmico.
- Copiar para a base faz slicing. O
virtualnão recupera a parte cortada. vector<Produto>guarda bases. Para polimorfismo, usa referências ouvector<unique_ptr<Forma>>.
Herança pública exige respeitar o contrato da base. Código comum não basta. Uma relação tem-um usa composição.
Assinaturas e destruição
class Forma {
public:
virtual ~Forma() = default;
virtual double area() const = 0; // pura, classe abstrata
};
overridemanda o compilador conferir.double area()não substituidouble area() const.- Chamada qualificada
obj.Base::f()escolhe a base. - Em construção e destruição, o despacho não alcança a parte ainda não construída ou já destruída.
- Destruir derivada por
Base*exige destrutor virtual. Vale paraunique_ptr<Base>.
A construção segue base, membros por declaração e corpo. A destruição corre
o corpo do destrutor e depois destrói membros e bases pela ordem inversa.
Exemplo de áreas: 3x4 mais quadrado 5 dá 12 + 25 = 37.