#include <iostream>
using namespace std;
class Pessoa {
public:
    string nome;
};
class Estudante : public Pessoa {
public:
    int matricula;
};
class EstGrad : public Estudante {
public:
    string curso;
};
int main() {
    EstGrad eg;
    eg.nome = "Carlos";
    eg.matricula = 999;
    eg.curso = "Engenharia";
    cout << eg.curso;
}
O que será impresso?
a)Carlos
b) 999
c)Engenharia
d)Erro de compilação.
e)Nenhuma saída.

Passo 1

O enunciado mostra um programa em C++ com três classes em herança e um main. Pergunta: o que será impresso quando o programa for executado? As alternativas são:
a) Carlos
b) 999
c) Engenharia
d) Erro de compilação.
e) Nenhuma saída.
Informações relevantes dadas no enunciado:
  • Há uma classe Pessoa com um membro público nome do tipo string.
  • Há uma classe Estudante que herda publicamente de Pessoa e tem um membro público matricula do tipo int.
  • Há uma classe EstGrad que herda publicamente de Estudante e tem um membro público curso do tipo string.
  • No main é criado um objeto EstGrad eg;.
  • As seguintes atribuições são feitas: eg.nome = "Carlos";, eg.matricula = 999;, eg.curso = "Engenharia";.
  • O programa faz cout << eg.curso;.
  • O arquivo inclui #include <iostream> e using namespace std;.

Passo 2

Entender herança e membros públicos (explicação didática e passo a passo): quando uma classe B herda publicamente de uma classe A (class B : public A), os membros públicos de A ficam públicos também em B. Isso significa que um objeto de B pode acessar diretamente os membros públicos definidos em A. No código:
  • Pessoa::nome é público, então Estudante e EstGrad (e seus objetos) têm esse membro acessível.
  • Estudante::matricula é público, então EstGrad e seus objetos têm esse membro acessível.
  • EstGrad::curso é público e pertence diretamente ao objeto EstGrad.
Resumo prático: o objeto eg tem, entre outros, três campos públicos acessíveis: nome, matricula e curso.

Passo 3

O que fazem as atribuições no main (passo a passo):
  • EstGrad eg; declara uma variável eg do tipo EstGrad — cria o objeto com os membros herdados e próprios.
  • eg.nome = "Carlos"; coloca a string "Carlos" no membro nome do objeto eg.
    • Explicando tipo string: é um tipo que armazena texto. A atribuição copia o conteúdo textual para o membro.
  • eg.matricula = 999; coloca o inteiro 999 no membro matricula.
  • eg.curso = "Engenharia"; coloca a string "Engenharia" no membro curso.
Portanto, após essas três linhas, os campos do objeto valem exatamente:
  • eg.nome contém "Carlos".
  • eg.matricula contém 999.
  • eg.curso contém "Engenharia".

Passo 4

O que faz cout << eg.curso; (explicação didática):
  • cout é o fluxo de saída padrão (tela).
  • O operador << escreve no fluxo a representação do valor à sua direita.
  • Quando passamos uma std::string, cout escreve os caracteres dessa string, exatamente em ordem, sem adicionar automaticamente nova linha.
  • Assim, cout << eg.curso; escreve o conteúdo de eg.curso, que é "Engenharia", na saída padrão.
Logo, a saída visível será o texto Engenharia (sem quebra de linha adicionada).

Passo 5

Sobre possível erro de compilação (análise e tranquilização):
  • O código inclui #include <iostream> e usa std::string. Em muitos compiladores a inclusão de <iostream> traz as definições necessárias para std::string por inclusão indireta; mas, estritamente, o mais correto e portátil é também incluir <string> quando se usa std::string.
  • Porém o enunciado pede para assumir que a questão está bem formulada. Nesse contexto, devemos considerar que o código compila e roda, e não há erro de compilação decorrente das classes ou do uso de membros (a herança e acessos são públicos e corretos).
  • Assim, não escolhemos a alternativa “Erro de compilação.”

Passo 6

Concluir qual alternativa corresponde à saída:
  • cout << eg.curso; escreve "Engenharia".
  • A alternativa que corresponde a isso é a alternativa c).

Resposta

c) Engenharia

Exercícios relacionados