Lições do módulo (2/2)
Polimorfismo e funções virtuais
O Polimorfismo nos permite tratar objetos de diferentes classes derivadas através de um ponteiro ou referência à sua classe base, garantindo que a versão correta de um método seja chamada em tempo de execução (Late Binding).
Funções virtuais: virtual e override
Para ativar o polimorfismo em um método, devemos declará-lo usando a palavra-chave virtual dentro da classe base. Em classes derivadas, usamos o especificador override para declarar explicitamente que estamos substituindo esse método.
class Employee {
public:
virtual void work() {
std::cout << "Generic work" << std::endl;
}
// IMPORTANT: Virtual destructor in base class to avoid memory leaks
virtual ~Employee() = default;
};
class Developer : public Employee {
public:
void work() override {
std::cout << "Writing C++ code" << std::endl;
}
};Usando ponteiros para a classe base, o C++ resolverá o método correto em tempo de execução:
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;Aulas Abstratas e Puras Funções Virtuais
Uma ** função virtual pura ** é uma função de membro virtual declarada com = 0 no final. Representa um contrato formal: a classe base não fornece nenhuma implementação, delegando-a inteiramente às subclasses.
Uma classe que contém pelo menos uma função virtual pura é chamada de ** Classe Abstrata ** e não pode ser instanciada diretamente.
class Instrument {
public:
virtual void play() = 0; // Pure virtual
virtual ~Instrument() = default;
};
class Piano : public Instrument {
public:
void play() override {
std::cout << "Playing piano..." << std::endl;
}
};direito, aplica-se:
Experimente também.
Defina um método virtual makeSound() no Animal que imprime 'Some sound'. Em seguida, substitua-o na classe Cat usando o especificador override para imprimir 'Meow'.
Mostrar dica
Lembre-se de acrescentar `virtual` ao método da classe base e colocar `override` após os parênteses do parâmetro na classe derivada.
Solução disponível após 3 tentativas
Declare uma função virtual pura print() retornando void dentro da classe abstrata Printable. Em seguida, crie a classe Document que herda publicamente de Printable e implementa o método print() para imprimir 'Printing Document'.
Mostrar dica
Uma função virtual pura é declarada com a assinatura `virtual void print() = 0;`. Certifique-se de que `Documento` herda publicamente de `Imprimível`.
Solução disponível após 3 tentativas