#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.
#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();
}
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
Figuradeclaravirtual void desenhar() = 0;(função virtual pura). - A classe
Circuloherda deFigurae implementavoid desenhar() override { cout << "Desenhando círculo" << endl; }. - Em
main()é criado um objetoCirculo c;e é chamada a funçãoc.desenhar();. - O programa inclui
<iostream>e usausing namespace std;.
Passo 2
O que significa
virtual void desenhar() = 0; dentro de Figura?- Essa sintaxe declara uma função virtual pura. Isso torna
Figurauma 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
overrideserve 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()emCirculocorresponde àvirtual void desenhar()emFigura. Logo,Circulofornece a implementação necessária e não é abstrata, entãoCirculo 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 diretamenteCirculo::desenhar(). - A implementação em
Circuloexecutacout << "Desenhando círculo" << endl;, ou seja, escreve a sequência de caracteresDesenhando círculoseguida de uma quebra de linha (por causa deendl).
Passo 5
Verificação de possíveis erros de compilação ou comportamento inesperado:
- O programa inclui
<iostream>e usastd::cout/std::endl(comusing namespace std;), então as referências acouteendlsã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