tutorial smart programar para introduccion inteligentes inteligente ejemplos crear contratos contrato c++ c++11 final pure-virtual

c++ - smart - programar contratos inteligentes



Funciones finales virtuales puras: legal en C++ 11 (3)

class Foo { public: virtual int foo() final = 0; };

Se compila bien.

¿No es Foo solo un desperdicio de espacio y un accidente en ciernes? ¿O me estoy perdiendo algo?


¿No es Foo solo un desperdicio de espacio?

De hecho, es; no se puede crear una instancia ya que es abstracto, y no se puede anular la función para crear una clase derivada no abstracta.

Podría usarse como una forma de evitar que una clase sea instanciada, si quieres hacerlo por alguna razón; pero incluso entonces probablemente tendría más sentido eliminar el constructor predeterminado.

¿Y un accidente en ciernes?

Realmente no. Como no puedes hacer nada con la clase, no puedes hacer nada malo con eso.


Es casi un completo desperdicio de espacio, como has dicho. Hay al menos un uso admitido para esto. El hecho de que compile, por cierto, no es sorprendente. Mientras el código sea legítimo, no necesita "tener sentido" para compilarlo.

Digamos que quieres usar Foo como política. Eso significa que se usará como un parámetro de plantilla, pero no necesita ser instanciado. De hecho, realmente no quieres que nadie ejemplifique la clase (aunque hay que admitir que no sabría por qué, qué puede doler).

Esto es exactamente lo que tienes aquí. Una clase con un tipo en el que puedes poner tus manos, pero no puedes crear una instancia (aunque hacer que el constructor sea privado sería probablemente mucho más sencillo).

Como bono adicional, puede agregar enum o funciones estáticas dentro del alcance de la clase. Se podrían usar sin crear instancias, y estarían dentro del espacio de nombres de esa clase. Por lo tanto, tiene una clase que se puede usar principalmente solo como tipo, pero aún tiene "alguna funcionalidad" incluida en forma de funciones estáticas.

La mayoría de las veces, es probable que uno simplemente envuelva esas cosas en un espacio de nombres, pero quién sabe, en alguna situación, esta podría ser la forma deseada.


Si estoy leyendo la gramática en 9.2 correctamente, esto es realmente legal, aunque es posible que haya omitido algo en las notas que lo prohíben.

declarador de miembros: declarador virt-specifier-seq (opt) pure-specifier (opt)

Luego muestra que virt-specifier-seq puede ser final y pure-specifier es = 0

No puedo ver de ninguna manera esto sería útil, aunque podría haber algún caso de esquina que lo use.