Puede declarar que su clase base tiene un destructor virtual puro que usted implementa. Como el compilador siempre proporciona un destructor, la clase derivada no será puramente virtual, pero la clase base no se puede instanciar directamente. Como siempre debes declarar un destructor virtual si tu clase tiene un método virtual, esto no implica ningún costo.
class Base
{
public:
virtual ~Base() = 0;
virtual void SomeVirtualMethod();
};
inline Base::~Base()
{
}
class Derived : public Base
{
};
inline Base* createBase()
{
// return new Base; // <- This won't compile
return new Derived; // <- This compile, Derived is not a pure virtual class !
}
Curioso: Java's MouseAdapter es exactamente lo que estás planeando escribir: una clase abstracta sin ningún método virtual puro para que las personas puedan elegir libremente cuáles de los métodos de escucha desean implementar y cuáles no. –
¿Importa realmente si alguien crea una instancia de la clase base y la registra como un detector de mouse? Es de suponer que simplemente ignorará todo (o realizará acciones predeterminadas para todo), exactamente lo mismo que si se hubieran tomado la molestia de escribir el código para heredar de su clase pero no implementar ninguna de las funciones. Dos formas diferentes de hacer algo sin sentido en lugar de uno. –