Como polimorfismo funciona em c ++
Como straddler cerca, C ++ suporta tanto precoce e tardia de ligação. Qualquer linguagem de programação pode suportar cedo ou mais tarde a ligação baseado nos caprichos de seus desenvolvedores. línguas mais antigas, como C tendem a apoiar o enlace inicial sozinho. línguas recentes como Java e C # suportam apenas a ligação tardia.
Você pode se surpreender que o padrão para C ++ é ligação inicial. A saída do OverloadOverride programar a forma como ele aparece é a seguinte:
Estamos em Student :: calcTuitionWe`re em Student :: calcTuitionPress Enter para continuar ...
A razão é simples, se um pouco datado. Primeiro, C ++ tem de agir tanto como C possível por padrão, para manter a compatibilidade para cima com o seu antecessor. Em segundo lugar, o polimorfismo adiciona uma pequena quantidade de sobrecarga para cada chamada de função tanto em termos de armazenamento de dados e código necessário para realizar a chamada.
Os fundadores do C ++ estavam preocupados que qualquer sobrecarga adicional seria usada como uma razão para não adotar C ++ como linguagem do sistema de escolha, então eles fizeram o mais eficiente ligação antecipada do padrão.
Para fazer uma polimórfica função membro, o programador deve sinalizar a função com palavra-chave do C ++ virtual, como mostrado no seguinte modificação para a declaração no OverloadOveride programa:
Estudante classe {public: virtual void calcTuition () {cout lt; lt; "Estamos em Student :: calcTuition" lt; lt; endl -}} -
a palavra-chave virtual que conta C ++ que calcTuition () é uma função de membro polimórfica. Ou seja, declarando calcTuition () meios virtuais que as chamadas para ele será obrigado tarde se houver qualquer dúvida quanto ao tipo de tempo de execução do objeto com o qual calcTuition () é chamado.
executar o OverloadOveride programa com calcTuition () declarou virtual gera o seguinte resultado:
Estamos em Student :: calcTuitionWe`re em GraduateStudent :: calcTuitionPress Enter para continuar ...
Se você estiver confortável com o depurador que vem com o seu ambiente de C ++, você realmente deve single-passo através deste exemplo. É tão legal para ver o single-passo programa em Estudante :: calcTuition () a primeira vez que fn () é chamado, mas em GraduateStudent :: calcTuition () na segunda chamada. Você não pode realmente apreciar polimorfismo até que tentei.
Você precisa declarar a função virtual só na classe base. O “virtualness” é realizada até a subclasse automaticamente. Às vezes, porém, os programadores seguir o padrão de codificação de declarar a função em todos os lugares virtual (virtualmente).