Siempre he oído que no debe heredar de una clase sin destructores virtuales, y no presté mucha atención porque simplemente no uso la herencia con tanta frecuencia. ¿Se aplica esta regla incluso si no quieres usar el polimorfismo, pero solo quieres toda la funcionalidad de una clase, y quieres agregar algo más? Para ser concreto, ¿la siguiente clase sería segura, con un comportamiento bien definido, siempre que no la use polimórficamente? (es decir, no hay punteros Eliminación de base a objetos derivados)Heredando de clases sin destructores virtuales
template<typename T>
class SomewhatSafeVector : public std::vector<T>
{
public:
typedef std::vector<T> base;
T& operator[](unsigned n) {
if (n >= base::size())
{
throw IndexOutOfBounds();
}
return base::operator[](n);
}
};
No importa si es correcto o no, pero aún no debe derivar de contenedores de biblioteca estándar. Además, si tiene problemas para acceder a los contenedores dinámicos dentro de sus límites, es posible que prefiera observar su pensamiento algorítmico de gran formato (piense en "0-1-many" y "rangos"), ya que un acceso fuera de límite es generalmente un error * logic *. –
Creo que en su ejemplo particular, la herencia no es una solución terriblemente elegante, ya que la herencia está destinada a la reutilización de la interfaz, no a la reutilización de la implementación. Claramente, no reutiliza la interfaz, ya que su 'operador []' arroja una excepción que 'std :: vector' no hará. Si desea volver a usar el código, solo use funciones simples compartidas o (como en este caso), haga de 'std :: vector' un miembro de' SomewhatSafeVector'. –
@KerrekSB: al primero, ¿por qué no? Para el segundo, no tengo tantos problemas. Pero creo que los límites de los contenedores marcados serían una buena idea para propósitos de instrucción y depuración. –