Como polimorfismo funcionar 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 ligação baseada nos caprichos de seus desenvolvedores. línguas mais antigas, como C tendem a apoiar ligação antecipada sozinho. línguas recentes como Java e C # oferecem suporte apenas a ligação tardia.
Você pode se surpreender que o padrão para C ++ é ligação antecipada. A saída do OverloadOverride programar a forma como ela aparece é como se segue:
Estamos em Student :: calcTuitionWe're em Student :: calcTuitionPress Enter para continuar ...
A razão é simples, se um pouco datada. 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 da função, tanto em termos de armazenamento de dados e o 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 função membro polimórfico, 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 diz a C ++ que calcTuition () é uma função membro polimórfico. 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ê está confortável com o depurador que vem com o seu ambiente de C ++, você realmente deve single-passo através deste exemplo. É muito legal ver a 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 o polimorfismo até que você tenha experimentado.
Você precisa declarar a função virtual só na classe base. o # 147 virtualness # 148- é levada 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).