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?
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?
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/
Tak więc powinno być zadeklarowane jako virtual ~ A() {}, bez "= 0". To nie jest czysto wirtualne, jeśli dostarczysz implementację – jalf
Um, tak jest. Pure oznacza tylko, że klasa pochodna musi również zapewniać implementację. – MSN
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
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:
rodem z projektu10,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]
:
struct C {
virtual void f() = 0 { }; // ill-formed
};
+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. –
Tak, to coś, co robisz w wywiadzie, żeby zadziwić swoich ankieterów;) – dirkgently
To nie jest wcale takie niezwykłe, z mojego doświadczenia. –
może skompilować, ale czy to łączy? –