Obra: Programar em C++/Polimorfismo
Matéria: Matemática
Nível: médio
conceito polimorfismo em linguagens orientadas objeto capacidade de objetos se comportarem de forma diferenciada em face de suas características ou do ambiente ao qual estejam submetidos mesmo quando executando ação que detenha semanticamente mesma designação polimorfismo em se apresenta sob diversas formas diferentes desde as mais simples como funções com mesmo nome lista de parâmetros diferentes até as mais complexas como funções virtuais cujas formas de execução são dependentes da classe qual objeto pertence são identificadas em tempo de execução funções virtuais include using std cout using std endl class base public declaração da função virtual virtual void quem_virtual cout quem_virtual chamada polimórfica mostra derivada ptr_base chamada comum não polimórfica mostra base cout chamando múltiplas funções virtuais funções virtuais passagem por valor construtor de cópia virtual classe base virtual consideremos seguinte programa este programa contém um erro não será compilado include using namespace std class base public int class derived public base derived inherits base public int class derived public base derived inherits base public int derived herda características de derived derived isto significa que há duas cópias da base em derived class derived public derived public derived public int sum int main derived ob ob isto se torna ambíguo qual estamos nos referindo ob ob ob sum ob ob ob ambíguo aqui também cout as classes derived derived são herdadas como classes base classe derived herda tanto de derived quanto de derived como resultado temos cópias da classe base presentes no objeto da derived por exemplo presente na linha ob isto resulta numa ambiguidade programa não vai compilar há duas maneiras para remediar situação aplicar operador de resolução de escopo manualmente este programa usa resolução de escopo explicita para selecionar include using namespace std class base public int class derived public base derived inherits base public int class derived public base derived inherits base public int class derived public derived public derived derived herda as bases derived derived isto significa que há duas cópias de bases em derived public int sum int main derived ob ob derived escopo resolvido usa em derived ob ob ob sum ob derived ob ob escopo resolvido cout segunda maneira através de classes bases virtuais quando temos ou mais objetos que são derivados da mesma base class podemos prevenir múltiplas cópias da base class declarando base class como virtual quando ela herdada exemplificando este program usa classes bases virtuais include using namespace std class base public int class derived virtual public base derived inherits base as virtual public int class derived virtual public base derived inherits base as virtual public int class derived public derived public derived derived inherits both derived and derived this time there is only one copy of base class public int sum int main derived ob ob now unambiguous ob ob ob sum ob ob ob un
ne copy of base class public int sum int main derived ob ob now unambiguous ob ob ob sum ob ob ob unambiguous cout repare que agora temos palavra virtual antes da classe