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?
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?
Odpowiedzi:
Tak. Musisz także zaimplementować destruktor:
class A {
public:
virtual ~A() = 0;
};
inline A::~A() { }
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/
Prywatne destruktory: dadzą ci błąd podczas tworzenia obiektu klasy pochodnej - nie inaczej. Może się jednak pojawić diagnostyka.
12.4 Destruktory
6 Destruktor można zadeklarować jako wirtualny (10.3) lub czysty wirtualny (10.4); jeśli w programie zostaną utworzone obiekty tej klasy lub klasy pochodnej, należy zdefiniować destruktor.
Klasa z czystym wirtualnym destruktorem jest klasą abstrakcyjną. Zwróć uwagę:
10.4 Klasy abstrakcyjne
2 Czysta funkcja wirtualna musi być zdefiniowana tylko wtedy, gdy jest wywoływana z lub tak jakby z (12.4) składnią Qualified-ID (5.1).
[ Uwaga : deklaracja funkcji nie może zawierać zarówno czystego specyfikatora, jak i definicji - uwaga końcowa]
Wzięte prosto z wersji roboczej:
struct C {
virtual void f() = 0 { }; // ill-formed
};