Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <typeinfo>
- using namespace std;
- class Orchidaceae {
- public:
- virtual void imprime(){ cout << "Em Orchidaceae" << endl;};
- };
- class Epidendrum : public Orchidaceae {
- public:
- virtual void imprime(){ cout << "Em Epidendrum" << endl;};
- virtual void exibePais(){ cout << "exibePais() em Epidendrum" << endl;};
- };
- class Cattleya : public Orchidaceae {
- public:
- virtual void imprime(){ cout << "Em Cattleya" << endl;};
- virtual void exibePais(){ cout << "exibePais() em Cattleya" << endl;};
- };
- class Epicattleya : public Epidendrum, public Cattleya {
- public:
- virtual void exibeFilha(){ cout << "Em Epicattleya" << endl;};
- virtual void exibePais(){ cout << "exibePais() em Epicattleya" << endl;};
- };
- void trata(Epidendrum& epi) {
- try {
- Cattleya& c = dynamic_cast<Cattleya&>(epi);
- cout << "Em trata()" << endl;
- }
- catch(std::bad_cast){ cout << "Nao eh possivel converter para Cattleya" << endl; }
- }
- int main() {
- Orchidaceae* o1 = new Cattleya;
- Orchidaceae* o2 = new Epidendrum;
- Epidendrum* ep1 = new Epicattleya;
- Epidendrum epi;
- Epicattleya epic;
- o1->imprime();
- Epidendrum* ep2 = dynamic_cast<Epidendrum*>(o1);
- if (ep2) ep2->exibePais();
- o2->imprime();
- Cattleya* c = dynamic_cast<Cattleya*>(o1);
- if (c) c->exibePais();
- trata(epi);
- trata(epic);
- ep1->imprime();
- return 0;
- }
- /*
- Na linha 38 está sendo feito um polimorfismo, guardando uma Cattleya em Orchidaceae
- Quando ele tenta chamar o imprime em Orchidaceae, na linha 44, ele vai buscar a função membro da classe derivada Cattleya, pois em
- Orchidaceae, a função imprime é virtual. Logo, será exibido "Em Cattleya"
- -----------
- Na linha 45, é feita a tentativa de conversão, de uma Orchidaceae, para um Epidendrum(downcasting, conversão de uma classe base para
- uma derivada)
- Na linha 47 ele valida se conseguiu fazer a conversão. Como não é possível fazer o downcasting, o comando dentro do if é
- desconsiderado
- -------------
- Na linha 49 ocorre o mesmo que na primeira exibição, a diferença, dessa vez, é que a frase exibida será "Em Epidendrum".
- --------------------------
- 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
- fazer o downcasting, a conversão será feita com sucesso.
- Como a conversão será feita com sucesso, Na linha 53 será exibido em tela: "exibePais() em Cattleya"
- ---------------------------
- Na linha 55, será passado como parâmetro para a função `trata` um objeto do tipo Epidendrum.
- 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
- em tela a mensagem "Nao eh possivel converter para Cattleya";
- --------------------------
- Na linha 57 é passado como parâmetro para a função `trata` um objeto do tipo Epicattleya.
- Na linha 30, a função `trata` tentará fazer um `upcasting`(converter de uma classe derivada, para uma base), como essa conversão é segura,
- o programa conseguirá converter, e a linha 31 será executada. Mostrando em tela: "Em trata()"
- --------------------------
- Finalmente, na linha 59 será chamada a função imprime da classe `Epidendrum`(da linha 40). O que exibirá em tela a
- mensagem: "Em Epidendrum"
- --------------------------
- Portanto, a saída será:
- Em Cattleya
- Em Epidendrum
- exibePais() em Cattleya
- Nao eh possivel converter para Cattleya
- Em trata()
- Em Epidendrum
- */
Advertisement
Add Comment
Please, Sign In to add comment