#include <iostream>
using namespace std;
class Base {
protected:
int valor = 50;
};
class Derivada : public Base {
public:
int dobrar() { return valor * 2; }
};
int main() {
Derivada d;
cout << d.dobrar();
}
O que o código acima faz?
a)Gerar erro de compilação, pois valor é protegido.
b)Compilar e imprimir 100.
c)Imprimir 50.
d)Gerar erro de tempo de execução.
e)Não compilar, pois falta construtor.
#include <iostream>
using namespace std;
class Base {
protected:
int valor = 50;
};
class Derivada : public Base {
public:
int dobrar() { return valor * 2; }
};
int main() {
Derivada d;
cout << d.dobrar();
}
a)Gerar erro de compilação, pois valor é protegido.
b)Compilar e imprimir 100.
c)Imprimir 50.
d)Gerar erro de tempo de execução.
e)Não compilar, pois falta construtor.
Passo 1
O enunciado pergunta: “O que o código acima faz?” e dá opções de resposta (a) a (e). Informações relevantes do código que preciso usar para decidir a resposta:
- Existe uma classe
Baseque declara um membro de dadosvalorinicializado com50e com especificador de acessoprotected. - Existe uma classe
Derivadaque herda publicamente deBase(class Derivada : public Base) e define um métododobrar()que retornavalor * 2. - Na função
main()é criado um objetoDerivada d;e é executadocout << d.dobrar();. - As opções incluem possíveis erros de compilação, execução ou o que será impresso.
Passo 2
Entender o que significa
protected em C++:protectedé um especificador de acesso que permite que a própria classe e classes derivadas acessem o membro, mas impede o acesso direto a partir de código que não seja membro (por exemplo, demain()).- Em outras palavras: membros
protectedsão inacessíveis para código externo, mas são acessíveis dentro das subclasses.
Exemplo rápido mental: se dentro deDerivadaeu escrevovalor, isso é permitido; se emmain()eu tentard.valor, isso NÃO é permitido e causaria erro de compilação.
Passo 3
Analisar a herança
class Derivada : public Base:publicna herança significa que os níveis de acesso da classe-base se mantêm em relação ao exterior:publiccontinuapublic,protectedcontinuaprotected(relativamente à classe derivada e código externo).- O ponto importante aqui é que
Derivadatem acesso aos membrosprotecteddeBase. Portanto, dentro deDerivada, usarvaloré legal.
Passo 4
Analisar o método
dobrar():- O método está declarado como
int dobrar() { return valor * 2; }. - Ele acessa
valor(membroprotectedda classe-base) e retorna o produto por2. valorvale50(inicialização na declaração emBase), então a expressãovalor * 2resulta em100(operacão inteira simples).
Passo 5
Verificar a criação do objeto e chamada do método em
main():Derivada d;usa o construtor padrão. Como não foi escrito um construtor, o compilador gera um construtor padrão implícito — então não há erro por “falta de construtor”.cout << d.dobrar();chama o métododobrar()no objetod, que, conforme Passo 4, retorna100.coutentão envia esse valor para a saída padrão.
Passo 6
Verificar potenciais erros de compilação ou execução mencionados nas opções:
- Opção (a): “Gerar erro de compilação, pois valor é protegido.” — incorreto, porque
valoré acessado dentro da classe derivadaDerivada, o que é permitido paraprotected. - Opção (d): “Gerar erro de tempo de execução.” — incorreto, não há operação indefinida ou divisão por zero; é só uma multiplicação de inteiros.
- Opção (e): “Não compilar, pois falta construtor.” — incorreto, o compilador fornece um construtor padrão implícito quando não há um declarado.
- Opção (c): “Imprimir 50.” — incorreto, pois o método retorna
valor * 2, logo100, não50.
Passo 7
Resumo lógico do fluxo: o membro
valor inicializa com 50 na classe-base, a classe derivada tem acesso a esse valor (por ser protected), o método dobrar() devolve 50 * 2 = 100, e cout imprime esse valor. Não há erros de compilação nem de execução nesse trecho.Resposta
b) Compilar e imprimir 100.