Siempre declaramos una función virtual pura como:
virtual void fun () = 0 ;
Es decir, siempre se asigna a 0.
Lo que entiendo es que esto es para inicializar la entrada vtable para esta función a NULL y cualquier otro valor aquí resulta en un error de tiempo de compilación. ¿Es este entendimiento correcto o no?
c++
abstract-class
pure-virtual
mukeshkumar
fuente
fuente
virtual void func() = 100;
Respuestas:
La razón que
=0
se usa es que Bjarne Stroustrup no creía que pudiera obtener otra palabra clave, como "puro" más allá de la comunidad C ++ en el momento en que se implementó la función. Esto se describe en su libro, The Design & Evolution of C ++ , sección 13.2.3:También declara explícitamente que esto no necesita establecer la entrada vtable en NULL, y que hacerlo no es la mejor manera de implementar funciones virtuales puras.
fuente
Al igual que con la mayoría de las preguntas "Por qué" sobre el diseño de C ++, el primer lugar para buscar es El diseño y la evolución de C ++ , de Bjarne Stroustrup 1 :
1 §13.2.3 Sintaxis
fuente
La sección 9.2 del estándar C ++ proporciona la sintaxis para los miembros de la clase. Incluye esta producción:
No hay nada especial sobre el valor. "= 0" es solo la sintaxis para decir "esta función es puramente virtual". No tiene nada que ver con la inicialización o los punteros nulos o el valor numérico cero, aunque la similitud con esas cosas puede tener un valor mnemónico.
fuente
= 0
¿Qué más le gustaría saber? Sería lo mismo que preguntar por qué el cuerpo de la función está envuelto con {} La respuesta sería, porque eso es lo que define la sintaxis de C ++.No estoy seguro de si hay algún significado detrás de esto. Es solo la sintaxis del lenguaje.
fuente
C ++ siempre ha evitado introducir nuevas palabras clave, ya que las nuevas palabras reservadas rompen los viejos programas que usan estas palabras para identificadores. A menudo se ve como una de las fortalezas del lenguaje que respeta el código antiguo en la medida de lo posible.
La
= 0
sintaxis podría haber sido elegida, ya que se asemeja a establecer una entrada vtable0
, pero esto es puramente simbólico. (La mayoría de los compiladores asignan tales entradas vtable a un código auxiliar que emite un error antes de abortar el programa). La sintaxis se eligió principalmente porque no se usó para nada antes y se guardó al introducir una nueva palabra clave.fuente
pure
palabra clave habría sido excelente en mi libro. De todos modos, es bueno entender la lógica.#define pure = 0
.C ++ debe tener una manera de distinguir una función virtual pura de una declaración de una función virtual normal. Eligieron usar la
= 0
sintaxis. Podrían haber hecho lo mismo fácilmente agregando una palabra clave pura. Pero C ++ es bastante reacio a agregar nuevas palabras clave y prefiere usar otros mecanismos para introducir características.fuente
Nada es "inicializado" o "asignado" cero en este caso.
= 0
en solo una construcción sintáctica que consiste en=
y0
tokens, que no tiene absolutamente ninguna relación con la inicialización o la asignación.No tiene ninguna relación con ningún valor real en "vtable". El lenguaje C ++ no tiene noción de "vtable" o algo así. Varias "vtables" no son más que simples detalles de implementaciones específicas.
fuente
Recuerdo haber leído que la justificación de la sintaxis divertida era que era más fácil (en términos de aceptación de estándares) que introducir otra palabra clave que hiciera lo mismo.
Creo que esto fue mencionado en The Design and Evolution of C ++ por Bjarne Stroustrup.
fuente
Supongo que esto es solo parte de la gramática de C ++. No creo que haya restricciones sobre cómo los compiladores realmente implementan esto para un formato binario específico dado. Su suposición probablemente era la correcta para los primeros compiladores de C ++.
fuente
El
= 0
declara una función virtual pura .No creo que sea verdad. Es solo una sintaxis especial. La vtable está definida por la implementación. Nadie dice que una entrada vtable para un miembro puro se debe poner a cero en la construcción (aunque la mayoría de los compiladores manejan vtables similares).
fuente
= 0
hace es que toda la clase sea abstracta y prohíbe las llamadas virtuales a funciones puras. Las llamadas no virtuales siguen siendo perfectamente correctas, que es cuando se utiliza la definición (si proporcionó una).__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… en lugar de Base :: f ()Bueno, también puede inicializar la entrada vtable para apuntar a una función real "
Parece intuitivo que la entrada vtable se puede definir para que no apunte a ninguna parte (0) o a una función. Permitirle especificar su propio valor probablemente resultaría en que apunte a basura en lugar de a una función. Pero es por eso que "= 0" está permitido y "= 1" no. Sospecho que Neil Butterworth tiene razón sobre por qué se usa "= 0"
fuente