-
Notifications
You must be signed in to change notification settings - Fork 1
/
respostas
86 lines (64 loc) · 4.04 KB
/
respostas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
1)
a) Os níveis de acesso significam que tudo que era public na classa base, continua public na classe que herda, o que era
privado na classe base continua privado na classe que herda e o que era protected na classe base, continua protected
na classe que herda.
b) Os construtores padrão da classe base seriam chamados implícitamente caso não os invocarmos explicitamente.
c) O compilador mostra um erro quando troca-se default por delete, na linha 9; Já quando apagamos a chamada do construtor
padrão nas linhas 23 e 38, os mesmos são chamados implicitamente.
d) O método title() está definido na linha 14, dentro da classe work, entre seus métodos públicos.
2) O resultado da execução desse programa é:
base
middle
derived
~derived
~middle
~base
E isso nos mostra que a classe derived constroi primeiro as classes que herdou, começando de base, para middle e finalmente
derived e quando tratamos dos destrutores, a ordem é o inversa, destruindo a classe com especificidades primeiro e as classes
que herdou por último, assim destruindo derived depois middle e por último base.
3)
Em linhas gearais, eo que este programa é capaz de fazer é inicializar variáveis por meio da função make_derived() presente na
classe "filha" derived. Ele também é capaz de incrementar valores de uma variável atrelada a uma das classes filhas da clase
principal(clase base), como mostrado no segundo comando da função main, além de incrementar eferências
(mostrado no terceiro comando e quarto comando) e fazer soma dos valores de a e b (quinto comando). Veja abaixo uma explicação
mais detalhada:
Espera-se as seguintes saídas, que é exatamente a saída após a compilação do código:
"base(42)
derived(42)
copybase(42)
copybase(43)
~base(43)
base(87)
derived(87)
~derived(87)
~base(87)
~base(44)
~derived(43)
~base(43)"
Na linha "derived d{make_derived()};" são impressos "base(42)" e "derived(42)" e, posteriormente, foi impresso "~derived(43)" e "~base(43)" que é resultado da chamada dos destrutores.
Na linha "base b{increment(d)};", o método increment é invocado com o valor 42 e retorna o valor 43 para b. Porém, como a passagem de valor é por referência, o construtor por cópia é ativado, imprimindo "copybase(42)", "copybase(43)" e "~base(43)".
Na linha "increment_reference(d);" d é incrementado, por referência, e passa a valer 43.
Na linha "increment_reference(b);", b é incrementado, por referência, e passa a valer 44.
Na linha "derived a(d.value()+b.value());", é feito a soma de d.value e b.value, resultando em 87. Por isso são impressas as linhas "base(87)" e "derived(87)".
Por fim, todos os destrutores são ativados na ordem inversa das chamadas dos métodos.
4) Os erros apontados pelo compilador derivam do fato de quando a classe derived é declarada, ela não consegue herdar os
métodos da classe base.
5)
a) Espera-se que o programa imprima na tela os dados dos livros e periódicos criados na função main na mesma ordem em
que eles foram criados. No caso dos livros, o primeiro dado é o título do livro, seguido do nome do autor e do ano da publicação.
No caso dos periódicos, o primeiro dado é o nome do periódico, seguido dos números da edição e, depois, da data de publicação.
b) A Palavra reservada "virtual" denota que há uma função (ou método) logo após ela que pode ser herdada nas classes derivadas
posteriormente. A palavra reservada "override" é usada imediatamente após a declaração de uma função e garante que que a
função é virtual e está herdando uma função virtual da classe base.
c)
ostream& operator<<(ostream& o, work& w)
{
w.print(o);
return o;
}
// adicionei o .cpp
d) Caso modifiquemos a função "void showoff (work const& w)" para "void showoff (work w)", o output mostrado não será mais
o visto anteriormente, e sim um monte de linhas vazias. Isto ocorre porque a função deixa de receber os valores passados por
referência e os dados dos livros e periódicos não são mais passados para a função.
9)
http://i.imgur.com/jlEKMyp.png