Vídeo: Tutorial Herança, Sobrecarga e Polimorfismo em C++ pt-BR 2024
Como um straddler de cerca, o C ++ suporta ligação inicial e adiantada. Qualquer linguagem de programação dada pode suportar ligação inicial ou antecipada com base nos caprichos de seus desenvolvedores. Linguagens mais antigas, como C, tendem a suportar apenas a ligação inicial. Linguagens recentes, como Java e C #, suportam apenas ligações tardias.
Você pode se surpreender que o padrão para C ++ seja vinculativo inicial. A saída do programa OverloadOverride da maneira como ele aparece é a seguinte:
Estamos em Estudante:: calctação Estamos em Estudante:: calctação Pressione Enter para continuar …
O motivo é simples, se um pouco datado. Primeiro, o C ++ tem que atuar tanto como o C quanto possível por padrão para manter a compatibilidade ascendente com o antecessor. Em segundo lugar, o polimorfismo adiciona uma pequena quantidade de sobrecarga a cada chamada de função tanto em termos de armazenamento de dados quanto de código necessário para executar a chamada.
Os fundadores do C ++ estavam preocupados com o fato de que qualquer sobrecarga adicional seria usada como motivo para não adotar o C ++ como a linguagem de escolha do sistema, de modo que eles tornaram o vínculo inicial mais eficiente ao padrão.
Para tornar um membro função polimórfico, o programador deve sinalizar a função com a palavra-chave C ++ virtual, como mostrado na seguinte modificação na declaração no OverloadOveride < programa: classe Estudante {público: virtual void calcTuition () {cout << "estamos em Student:: calcTuition" << endl;}};
A palavra-chave
virtual que informa C ++ que calcTuition () é uma função de membro polimórfico. Ou seja, declarar que calcTuition () virtual significa que as chamadas para ele serão vinculadas tarde se houver alguma dúvida quanto ao tipo de tempo de execução do objeto com o qual calcTuition () é chamado.
Executando o programa OverloadOveride com calcTuition () declarado virtual gera a seguinte saída: Estamos no Student:: calcTuition Estamos em GraduateStudent:: calcTuition Press Digite para continuar …
Se você estiver confortável com o depurador que vem com o seu ambiente C ++, você realmente deve passar por um único passo neste exemplo. É tão legal ver o programa em uma única etapa em Student:: calcTuition () pela primeira vez que fn () é chamado, mas em GraduateStudent:: calcTuition () na segunda chamada. Você não pode realmente apreciar o polimorfismo até que você o tenha tentado.