virtuales que puro puras polimorfismo objeto modificador herencia funciones c++ abstract-class pure-virtual

que - polimorfismo puro c++



¿Por qué una función virtual pura se inicializa con 0? (11)

Al igual que con la mayoría de las preguntas sobre "Por qué" sobre el diseño de C ++, el primer lugar para buscar es El diseño y la evolución de C ++ , por Bjarne Stroustrup 1 :

Se eligió la sintaxis curious =0 sobre la alternativa obvia de introducir una nueva palabra clave pure o abstract porque en ese momento no veía ninguna posibilidad de que se aceptara una nueva palabra clave. Si hubiera sugerido pure , el Release 2.0 se habría enviado sin clases abstractas. Dada la elección entre una sintaxis más agradable y clases abstractas, elegí clases abstractas. En lugar de arriesgarme a retrasarme e incurrir en ciertas peleas sobre pure , utilicé la convención tradicional C y C ++ de usar 0 para representar "no está allí". La sintaxis =0 ajusta a mi opinión de que un cuerpo de función es el inicializador de una función también con la vista (simplista, pero generalmente adecuada) del conjunto de funciones virtuales que se implementan como un vector de punteros de función. [...]

1 §13.2.3 Sintaxis

Siempre declaramos una función virtual pura como:

virtual void fun () = 0 ;

Es decir, siempre está asignado a 0.

Lo que entiendo es que esto es para inicializar la entrada vtable para esta función en NULL y cualquier otro valor aquí resulta en un error de tiempo de compilación. ¿Es este entendimiento correcto o no?


Bueno, también puedes inicializar la entrada de vtable para apuntar a una función real "

virtual void fun() { //dostuff() }

Parece intuitivo que la entrada vtable puede definirse 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" en absoluto


C ++ debe tener una forma de distinguir una función virtual pura de una declaración de una función virtual normal. Eligieron usar la sintaxis = 0 . Simplemente podrían haber hecho lo mismo al agregar una palabra clave pura. Pero C ++ es bastante reacio a agregar nuevas palabras clave y prefiere usar otros mecanismos para introducir características.


C ++ siempre ha evitado introducir nuevas palabras clave, ya que las palabras reservadas nuevas rompen los programas antiguos que usan estas palabras para los identificadores. A menudo se ve uno de los puntos fuertes del lenguaje que respeta el código antiguo tanto como sea posible.

La sintaxis =0 podría haber sido elegida, ya que se asemeja a establecer una entrada vtable en 0 , pero esto es puramente simbólico. (La mayoría de los compiladores asignan tales entradas vtable a un stub que emite un error antes de abortar el programa). La sintaxis se eligió principalmente porque no se usaba para nada antes y se guardó introduciendo una nueva palabra clave.


El motivo =0 se usa es que Bjarne Stroustrup no pensó que pudiera obtener otra palabra clave, como "puro" más allá de la comunidad C ++ en el momento en que se implementaba la función. Esto se describe en su libro, El diseño y la evolución de C ++ , sección 13.2.3:

Se eligió la sintaxis curiosa = 0 ... porque en ese momento no veía ninguna posibilidad de que se aceptara una nueva palabra clave.

También afirma explícitamente que no es necesario establecer la entrada de vtable en NULL, y que hacerlo no es la mejor manera de implementar funciones virtuales puras.


La sección 9.2 del estándar C ++ brinda la sintaxis para los miembros de la clase. Incluye esta producción:

pure-specifier: = 0

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 nemotécnico.


Nada es cero "inicializado" o "asignado" en este caso. = 0 en solo una construcción sintáctica que consta de = y 0 tokens, que no tiene ninguna relación con la inicialización o la asignación.

No tiene relación con ningún valor real en "vtable". El lenguaje C ++ no tiene noción de "vtable" o algo así. Varios "vtables" no son más que detalles de implementaciones específicas.


No estoy seguro de si hay algún significado detrás de esto. Es solo la sintaxis del lenguaje.


Recuerdo haber leído que la justificación de la sintaxis graciosa 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 El diseño y la evolución de C ++ por Bjarne Stroustrup.


Supongo que esto es solo parte de la gramática C ++. No creo que haya ninguna restricción sobre cómo los compiladores realmente implementan esto para un formato binario específico dado. Probablemente, supongo que era correcto para los compiladores de C ++ de los primeros días.


The = 0 declara una función virtual pura .

Lo que se entiende es que esto es para inicializar la entrada de vtable para esta función a NULL y cualquier otro valor aquí da como resultado error de tiempo de compilación

No creo que eso sea cierto. Es solo una sintaxis especial. El vtable está definido por la implementación. Nadie dice que una entrada vtable para un miembro puro debe ponerse a cero en la construcción (aunque la mayoría de los compiladores manejan tablas similares).