que tienen una clase base con una función virtual opcional¿Las funciones virtuales no puras con los parámetros son una mala práctica?
class Base {
virtual void OnlyImplementThisSometimes(int x) {}
};
Cuando compilo este recibo una advertencia acerca del parámetro x no utilizada. ¿Hay alguna otra forma en que debería haber implementado la función virtual? He reescrito así:
class Base {
virtual void OnlyImplementThisSometimes(int x)
{
x = 0;
}
};
También tengo el problema de que si no tengo cuidado, la subclase hago puede implementar la función mal y luego no me fijo debido a la sobrecarga: por ejemplo,
class Derived : public Base {
void OnlyImplementThisSometimes(int x, int y) { // some code }
};
Derived d;
Base *b = dynamic_cast<Base *>(&d);
b->OnlyImplementThisSometimes(x); // calls the method in the base class
El método de la clase base fue llamado porque he implementado la función derivada con un parámetro "int y" pero no hay ninguna advertencia acerca de esto. ¿Son estos errores comunes en C++ o he entendido mal las funciones virtuales?
La otra forma de hacer esto (el mismo efecto) es comentar el nombre de la variable en línea, por ejemplo: int/* x * /. Si el nombre de la variable es descriptivo (que debería ser), esto ayudará a los lectores. – Nick
@Nick: Creo firmemente en la seguridad de tipo fuerte, donde el tipo describe la intención (y evita la confusión de argumentos). Si (principalmente) codifica así, los nombres de los parámetros no son importantes. –
El último párrafo se puede editar para reflejar la palabra clave 'override' en C++. – Rotem