Pular para o conteúdo principal
Módulo 6 · Lição 2 de 214/18 no curso~15 min
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.

C++
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:

C++
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.

C++
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.

Exercício#cpp.m6.l2.e1
Tentativas: 0Carregando…

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'.

Carregando editor…
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

Exercício#cpp.m6.l2.e2
Tentativas: 0Carregando…

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'.

Carregando editor…
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