Sempre declaramos uma função virtual pura como:
virtual void fun () = 0 ;
Ou seja, é sempre atribuído a 0.
O que eu entendo é que isso é para inicializar a entrada vtable para esta função como NULL e qualquer outro valor aqui resulta em um erro de tempo de compilação. Esse entendimento está correto ou não?
c++
abstract-class
pure-virtual
mukeshkumar
fonte
fonte
virtual void func() = 100;
Respostas:
O motivo
=0
é usado porque Bjarne Stroustrup não achou que poderia obter outra palavra-chave, como "puro" após a comunidade C ++ no momento em que o recurso estava sendo implementado. Isso é descrito em seu livro The Design & Evolution of C ++ , seção 13.2.3:Ele também afirma explicitamente que isso não precisa definir a entrada vtable como NULL e que isso não é a melhor maneira de implementar funções virtuais puras.
fonte
Como na maioria das perguntas "Por que" sobre o design do C ++, o primeiro lugar para procurar é O design e a evolução do C ++ , de Bjarne Stroustrup 1 :
1 §13.2.3 Sintaxe
fonte
A seção 9.2 do padrão C ++ fornece a sintaxe para os alunos. Inclui esta produção:
Não há nada de especial no valor. "= 0" é apenas a sintaxe para dizer "esta função é pura virtual". Não tem nada a ver com inicialização ou ponteiros nulos ou com o valor numérico zero, embora a semelhança com essas coisas possa ter valor mnemônico.
fonte
= 0
O que mais você gostaria de saber? Seria o mesmo que perguntar por que o corpo da função está envolvido com {} A resposta seria, porque é isso que a sintaxe C ++ define.Não tenho certeza se há algum significado por trás disso. É apenas a sintaxe do idioma.
fonte
O C ++ sempre evitou a introdução de novas palavras-chave, pois novas palavras reservadas quebram programas antigos que usam essas palavras para identificadores. É frequentemente visto como um dos pontos fortes da linguagem que respeita o código antigo, tanto quanto possível.
A
= 0
sintaxe pode realmente ter sido escolhida, pois se assemelha a definir uma entrada de tabela0
, mas isso é puramente simbólico. (A maioria dos compiladores atribui essas entradas do vtable a um esboço que emite um erro antes de interromper o programa.) A sintaxe foi escolhida principalmente porque não havia sido usada antes e economizou a introdução de uma nova palavra-chave.fonte
pure
palavra - chave teria sido ótima em meu livro. Enfim, é bom entender a lógica.#define pure = 0
.O C ++ deve ter uma maneira de distinguir uma função virtual pura de uma declaração de uma função virtual normal. Eles escolheram usar a
= 0
sintaxe. Eles poderiam facilmente fazer o mesmo adicionando uma palavra-chave pura. Mas o C ++ é bastante relutante em adicionar novas palavras-chave e prefere usar outros mecanismos para introduzir recursos.fonte
Nada é "inicializado" ou "atribuído" zero neste caso.
= 0
em apenas uma construção sintática que consiste em=
e0
tokens, que não tem absolutamente nenhuma relação com a inicialização ou a atribuição.Não tem relação com nenhum valor real em "vtable". A linguagem C ++ não tem noção de "vtable" ou algo assim. Várias "vtables" nada mais são do que apenas detalhes de implementações específicas.
fonte
Lembro-me de ler que a justificativa para a sintaxe engraçada era que era mais fácil (em termos de aceitação de padrões) do que introduzir outra palavra-chave que faria a mesma coisa.
Acredito que isso foi mencionado em The Design and Evolution of C ++ por Bjarne Stroustrup.
fonte
Eu diria que isso é apenas parte da gramática C ++. Eu não acho que haja restrições sobre como os compiladores realmente implementam isso para um determinado formato binário específico. Sua suposição provavelmente estava certa para os compiladores C ++ do início do dia.
fonte
O
= 0
declara uma função virtual pura .Eu não acho que seja verdade. É apenas uma sintaxe especial. A vtable é definida pela implementação. Ninguém diz que uma entrada vtable para um membro puro deve ser zerada na construção (embora a maioria dos compiladores manipule vtables semelhantes).
fonte
= 0
faz é tornar toda a classe abstrata e proibir chamadas virtuais para funções puras. As chamadas não virtuais ainda estão perfeitamente bem, ou seja, quando a definição (se você forneceu uma) for usada.__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… em vez de Base :: f ()Bem, você também pode inicializar a entrada vtable para apontar para uma função real "
Parece intuitivo que a entrada vtable possa ser definida para apontar para lugar nenhum (0) ou para uma função. Permitir que você especifique seu próprio valor para ele provavelmente resultaria em apontar para lixo em vez de para uma função. Mas é por isso que "= 0" é permitido e "= 1" não é. Eu suspeito que Neil Butterworth esteja certo sobre o porquê de "= 0" ser usado
fonte