#include <iostream>
using namespace std;
class Figura {
public:
    virtual void desenhar() = 0;
};
class Circulo : public Figura {
public:
    void desenhar() override { cout << "Desenhando círculo" << endl; }
};
int main() {
    Circulo c;
    c.desenhar();
}
O que será impresso?
a) Nada.
b) Desenhando círculo
c) Erro de compilação.
d) Desenhando figura.
e) Círculo criado.

Passo 1

O enunciado apresenta um programa em C++ e pergunta “O que será impresso?”. Informações relevantes dadas no código:
  • A classe Figura declara virtual void desenhar() = 0; (função virtual pura).
  • A classe Circulo herda de Figura e implementa void desenhar() override { cout << "Desenhando círculo" << endl; }.
  • Em main() é criado um objeto Circulo c; e é chamada a função c.desenhar();.
  • O programa inclui <iostream> e usa using namespace std;.

Passo 2

O que significa virtual void desenhar() = 0; dentro de Figura?
  • Essa sintaxe declara uma função virtual pura. Isso torna Figura uma classe abstrata.
  • Uma classe abstrata não pode ser instanciada (ou seja, não dá para fazer Figura f;).
  • A intenção é forçar classes derivadas a fornecerem uma implementação de desenhar().

Passo 3

A classe Circulo implementa desenhar() com override.
  • O especificador override serve para garantir que a assinatura do método corresponde exatamente a uma função virtual da classe base. Se houvesse erro de assinatura, o compilador reclamaria.
  • Aqui a assinatura bate: void desenhar() em Circulo corresponde à virtual void desenhar() em Figura. Logo, Circulo fornece a implementação necessária e não é abstrata, então Circulo c; é válido.

Passo 4

O que acontece ao chamar c.desenhar(); quando c é um objeto da classe Circulo?
  • Mesmo se a função fosse chamada via ponteiro ou referência para a base, por ser virtual ela faria dispatch para a implementação mais derivada em tempo de execução. Mas aqui o objeto é diretamente do tipo Circulo, então chama-se diretamente Circulo::desenhar().
  • A implementação em Circulo executa cout << "Desenhando círculo" << endl;, ou seja, escreve a sequência de caracteres Desenhando círculo seguida de uma quebra de linha (por causa de endl).

Passo 5

Verificação de possíveis erros de compilação ou comportamento inesperado:
  • O programa inclui <iostream> e usa std::cout/std::endl (com using namespace std;), então as referências a cout e endl são válidas.
  • Não há tentativa de instanciar Figura, então o fato de ela ser abstrata não causa erro.
  • Não há outros erros de sintaxe ou assinatura no código apresentado. Portanto o código compila e roda normalmente.

Resposta

b) Desenhando círculo

Exercícios relacionados