2009-03-10 17 views
136

Czy to źle napisać:Czysta wirtualnego destruktora w C++

class A { 
public: 
    virtual ~A() = 0; 
}; 

do abstrakcyjnej klasy bazowej?

Przynajmniej kompiluje się w MSVC ... Czy nastąpi awaria w czasie wykonywania?

+7

może skompilować, ale czy to łączy? –

Odpowiedz

182

Tak. Musisz także zaimplementować destruktor: wystarczy, że wystarcza

class A { 
public: 
    virtual ~A() = 0; 
}; 

inline A::~A() { } 

.

A ponieważ uzyskałem głosowanie w dół, powinienem wyjaśnić: jeśli coś wywrze z A, a następnie spróbuje go usunąć lub zniszczyć, zostanie ostatecznie wywołany destruktor A. Ponieważ jest on czysty i nie ma implementacji, powstanie niezdefiniowane zachowanie. Na jednej popularnej platformie wywołają one czystą obsługę i awarię.

Edit: ustalenie, że deklaracja jest bardziej conformant, skompilowany z http://www.comeaucomputing.com/tryitout/

+0

Tak więc powinno być zadeklarowane jako virtual ~ A() {}, bez "= 0". To nie jest czysto wirtualne, jeśli dostarczysz implementację – jalf

+15

Um, tak jest. Pure oznacza tylko, że klasa pochodna musi również zapewniać implementację. – MSN

+65

Wdrożenie czystych funkcji wirtualnych jest w rzeczywistości legalne. Bardzo przydatne do zapewnienia domyślnej implementacji, ale wymuszanie podklas, aby wywołać ją jawnie. – jmucchiello

45

Private destruktorów: dają ci błąd podczas tworzenia obiektu klasy pochodnej - nie inaczej. Może się jednak pojawić diagnostyka.

12,4 destruktory

6A destructor może być uznana wirtualna (10.3) lub czystego wirtualnego (10,4); jeśli w programie zostaną utworzone jakiekolwiek obiekty tej klasy lub klasy pochodnej, zdefiniowany zostanie destruktor.

Klasa z czystym wirtualnym destruktorem jest klasą abstrakcyjną. Uwaga dobrze:

10,4 Streszczenie klasy

2 Czysty wirtualne funkcja musi być określona jedynie jeśli wywołana lub jak w (12,4), składnia wykwalifikowany ID (5,1).

[Uwaga: deklaracja funkcji nie może zapewnić zarówno czystej specyfikator i definicję końcem Uwaga]

rodem z projektu

:

struct C { 
    virtual void f() = 0 { }; // ill-formed 
}; 
+11

+1. Myślę, że Herb Sutter ma również dobre informacje na ten temat: http://www.gotw.ca/gotw/031.htm. Warto zauważyć, że każda czysta wirtualna funkcja może mieć zapewnioną implementację, a nie tylko destruktory. –

+6

Tak, to coś, co robisz w wywiadzie, żeby zadziwić swoich ankieterów;) – dirkgently

+1

To nie jest wcale takie niezwykłe, z mojego doświadczenia. –

Powiązane problemy