Możesz zadeklarować, że jesteś klasą podstawową jako posiadającą czysty wirtualny destruktor, który implementujesz. Ponieważ destruktor jest zawsze dostarczany przez kompilator, klasa pochodna nie będzie czysto wirtualna, ale klasa podstawowa nie może być bezpośrednio utworzona. Ponieważ zawsze powinieneś zadeklarować wirtualny destruktor, jeśli twoja klasa ma metodę wirtualną, nie wiąże się to z żadnymi kosztami.
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 !
}
Zabawne: Java MouseAdapter to dokładnie to, co planujesz napisać: klasa abstrakcyjna bez żadnych czystych wirtualnych metod, aby ludzie mogli swobodnie wybierać, które metody słuchacza chcą zaimplementować, a które nie. –
Czy rzeczywiście ma znaczenie, jeśli ktoś tworzy instancję klasy podstawowej i rejestruje ją jako nasłuchiwanie myszy? Przypuszczalnie po prostu zignoruje wszystko (lub wykona domyślne akcje dla wszystkiego), dokładnie tak samo, jakby zadał sobie trud napisania kodu, który odziedziczyłby po klasie, ale nie zaimplementował żadnej z tych funkcji. Dwa różne sposoby robienia czegoś bezcelowego zamiast jednego. –