Pregunta

He sido atrapado por este problema más de una vez:

class A{
public:
  virtual ~A() {}
  virtual int longDescriptiveName(){ return 0; }
};

class B: public A{
public:
  virtual int longDescriptveName(){ return 1; } // Oops
};

Si la función virtual pura es, el compilador captura el error. Pero si no es que esto puede ser un terrible error de rastrear. Parte del problema es que los nombres de las funciones son tal vez demasiado tiempo. Pero todavía me pregunto, ¿hay una manera de ver estos errores antes?

¿Fue útil?

Solución

Una posibilidad es la función virtual pura de poco uso en la aplicación:

virtual int longDescriptiveName() = 0
{
    return 0; 
}

Esto obliga a clases derivadas se anulan. A continuación, puede llamar a la implementación de la clase base solo si sólo quieren que el comportamiento.

También es necesario asegurarse de que su jerarquía de herencia es plana, en lugar de múltiples capas, que en general es bueno de todos modos porque la herencia es frágil suficiente sin llenar en las capas.

Otros consejos

Si se compila con Microsoft Visual C ++ 2005 o más reciente, hay un extensión no estándar que le permite escribir:

virtual int longDescriptveName() override { return 1; }

Y el compilador se quejará. Si compila también con otros compiladores, es probablemente inteligente como para hacer un #define para que pueda controlar el comportamiento.

Antiguo pregunta necro'd, pero una buena manera es poner a prueba temprana, ya sea formal con las pruebas unitarias, o de manera más informal, antes de empezar a usar sus clases. En otras palabras, comprobar desde el principio que:

A test_a;
B test_b;
A& poly_a = test_a;
A& poly_b = test_b;
assert(poly_a.longDescriptiveName() == 0);
assert(poly_b.longDescriptiveName() == 1);

antes se escribe más de 10.000 líneas de código que utilizan sus clases.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top