Como se ha dicho, NVI es un modismo de programación, relacionado con una categoría de idiomas. Se ha promovido por Herb Sutter entre otros, ya que ayuda a hacer cumplir los contratos:
- invariantes de clase
- contratos de función (afirmaciones sobre los parámetros pasados y el valor de retorno generada)
- operaciones repetitivas (como la tala)
- control sobre las excepciones generadas (mala idea, aunque;))
Sin embargo, la puesta en práctica de hecho pueden diferir considerablemente, por ejemplo, otro ejemplo de NVI implementación es combinarlo con Pimpl:
class FooImpl;
class Foo
{
public:
enum type { Type1, Type2 };
Foo(type t, int i, int j);
int GetResult() const;
private:
FooImpl* mImpl;
};
Y para la puesta en práctica:
struct FooImpl
{
virtual ~FooImpl();
virtual int GetResult() const;
};
class FooType1: public FooImpl
{
public:
FooType1(int i, int j);
virtual int GetResult() const;
private:
/// ...
};
siempre he encontrado que transmitió el punto mejor. ¿Lo has descubierto?
El punto principal es que virtual
es un detalle de implementación. Y exponer los detalles de implementación en la interfaz es una mala idea, porque es posible que desee cambiarlos.
Además, los detalles de implementación tienden a interferir con la compatibilidad binaria. Por ejemplo, agregar un nuevo método virtual
en una clase puede cambiar el diseño de la tabla virtual (técnica de implementación común) y, por lo tanto, estropear la compatibilidad binaria. En gcc, debe asegurarse de agregarlo último (entre los virtuales) si desea conservar la compatibilidad.
Al usar la combinación anterior de NVI + Pimpl, no hay ningún virtual
(ni siquiera privado) en la clase expuesta. El diseño de la memoria es compatible con versiones anteriores y posteriores. Hemos logrado compatibilidad binaria.
Aquí, utilizamos varios patrones a la vez:
- plantilla Método
- Estrategia (ya que podemos cambiar el puntero a voluntad)
- fábrica (para decidir qué aplicación obtenemos)
No utilizaría el enlace de wikipedia como referencia, su uso de bloqueos es frágil ante las excepciones ... –