MaXwEllDeN

Questão 4, TP 2016.2 2ª Estágio

Feb 21st, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <typeinfo>
  3. using namespace std;
  4.  
  5. class Orchidaceae {
  6. public:
  7.     virtual void imprime(){ cout << "Em Orchidaceae" << endl;};
  8. };
  9.  
  10. class Epidendrum : public Orchidaceae {
  11. public:
  12.     virtual void imprime(){ cout << "Em Epidendrum" << endl;};
  13.     virtual void exibePais(){ cout << "exibePais() em Epidendrum" << endl;};
  14. };
  15.  
  16. class Cattleya : public Orchidaceae {
  17. public:
  18.     virtual void imprime(){ cout << "Em Cattleya" << endl;};
  19.     virtual void exibePais(){ cout << "exibePais() em Cattleya" << endl;};
  20. };
  21.  
  22. class Epicattleya : public Epidendrum, public Cattleya {
  23. public:
  24.     virtual void exibeFilha(){ cout << "Em Epicattleya" << endl;};
  25.     virtual void exibePais(){ cout << "exibePais() em Epicattleya" << endl;};
  26. };
  27.  
  28. void trata(Epidendrum& epi) {
  29.     try {
  30.         Cattleya& c = dynamic_cast<Cattleya&>(epi);
  31.         cout << "Em trata()" << endl;
  32.     }
  33.    
  34.     catch(std::bad_cast){ cout << "Nao eh possivel converter para Cattleya" << endl; }
  35. }
  36.  
  37. int main() {
  38.     Orchidaceae* o1 = new Cattleya;
  39.     Orchidaceae* o2 = new Epidendrum;
  40.     Epidendrum* ep1 = new Epicattleya;
  41.     Epidendrum epi;
  42.     Epicattleya epic;
  43.    
  44.     o1->imprime();
  45.     Epidendrum* ep2 = dynamic_cast<Epidendrum*>(o1);
  46.    
  47.     if (ep2) ep2->exibePais();
  48.    
  49.     o2->imprime();
  50.    
  51.     Cattleya* c = dynamic_cast<Cattleya*>(o1);
  52.    
  53.     if (c) c->exibePais();
  54.  
  55.     trata(epi);
  56.    
  57.     trata(epic);
  58.  
  59.     ep1->imprime();
  60.     return 0;
  61. }
  62.  
  63.  
  64. /*
  65.  
  66. Na linha 38 está sendo feito um polimorfismo, guardando uma Cattleya em Orchidaceae
  67.  
  68. Quando ele tenta chamar o imprime em Orchidaceae, na linha 44, ele vai buscar a função membro da classe derivada Cattleya, pois em
  69. Orchidaceae, a função imprime é virtual. Logo, será exibido "Em Cattleya"
  70.  
  71. -----------
  72. Na linha 45, é feita a tentativa de conversão, de uma Orchidaceae, para um Epidendrum(downcasting, conversão de uma classe base para
  73. uma derivada)
  74.  
  75. Na linha 47 ele valida se conseguiu fazer a conversão. Como não é possível fazer o downcasting, o comando dentro do if é
  76. desconsiderado
  77.  
  78. -------------
  79.  
  80. Na linha 49 ocorre o mesmo que na primeira exibição, a diferença, dessa vez, é que a frase exibida será "Em Epidendrum".
  81.  
  82. --------------------------
  83.  
  84. Na linha 51, ele tenta fazer um downcasting. Como o que havia guardado em o1(linha 38), é o mesmo tipo para o qual ele está tentando
  85. fazer o downcasting, a conversão será feita com sucesso.
  86.  
  87. Como a conversão será feita com sucesso, Na linha 53 será exibido em tela: "exibePais() em Cattleya"
  88.  
  89. ---------------------------
  90.  
  91. Na linha 55, será passado como parâmetro para a função `trata` um objeto do tipo Epidendrum.
  92.  
  93. Na linha 30, a função `trata` tentará fazer um downcasting, de Epidendrum para Cattleya. Como as classes Epidendrum e Cattleya, não estão relacionadas por herança, o dynamic_cast irá lançar uma execção, com isso, o código irá pular, da linha 30, para a 34. E assim, será exibido
  94. em tela a mensagem "Nao eh possivel converter para Cattleya";
  95.  
  96. --------------------------
  97.  
  98. Na linha 57 é passado como parâmetro para a função `trata` um objeto do tipo Epicattleya.
  99.  
  100. Na linha 30, a função `trata` tentará fazer um `upcasting`(converter de uma classe derivada, para uma base), como essa conversão é segura,
  101. o programa conseguirá converter, e a linha 31 será executada. Mostrando em tela: "Em trata()"
  102.  
  103.  
  104. --------------------------
  105.  
  106. Finalmente, na linha 59 será chamada a função imprime da classe `Epidendrum`(da linha 40). O que exibirá em tela a
  107. mensagem: "Em Epidendrum"
  108. --------------------------
  109. Portanto, a saída será:
  110.  
  111. Em Cattleya
  112. Em Epidendrum
  113. exibePais() em Cattleya
  114. Nao eh possivel converter para Cattleya
  115. Em trata()
  116. Em Epidendrum
  117.  
  118.  
  119. */
Advertisement
Add Comment
Please, Sign In to add comment