Czy źle jest pisać:
class A {
public:
virtual ~A() = 0;
};
dla abstrakcyjnej klasy bazowej?
Przynajmniej to kompiluje się w MSVC ... Czy ulegnie awarii w czasie wykonywania?
c++
polymorphism
destructor
pure-virtual
Ivan Krechetov
źródło
źródło
Odpowiedzi:
Tak. Musisz także zaimplementować destruktor:
powinno wystarczyć.
A ponieważ głosowanie negatywne zostało odrzucone, powinienem wyjaśnić: jeśli uzyskasz cokolwiek z A, a następnie spróbujesz to usunąć lub zniszczyć, w
A
końcu zostanie wywołany destruktor. Ponieważ jest czysty i nie ma implementacji, nastąpi niezdefiniowane zachowanie. Na jednej popularnej platformie spowoduje to wywołanie obsługi purecall i awarię.Edycja: ustalenie deklaracji, aby była bardziej zgodna, skompilowane z http://www.comeaucomputing.com/tryitout/
źródło
Prywatne destruktory: dadzą ci błąd podczas tworzenia obiektu klasy pochodnej - nie inaczej. Może się jednak pojawić diagnostyka.
Klasa z czystym wirtualnym destruktorem jest klasą abstrakcyjną. Zwróć uwagę:
Wzięte prosto z wersji roboczej:
źródło