Zawsze deklarujemy czystą funkcję wirtualną jako:
virtual void fun () = 0 ;
To znaczy, zawsze jest przypisane do 0.
Rozumiem, że ma to na celu zainicjowanie wpisu vtable dla tej funkcji na NULL, a każda inna wartość tutaj powoduje błąd czasu kompilacji. Czy to rozumienie jest poprawne, czy nie?
c++
abstract-class
pure-virtual
mukeshkumar
źródło
źródło
virtual void func() = 100;
Odpowiedzi:
Powodem
=0
jest to, że Bjarne Stroustrup nie sądził, że mógłby uzyskać inne słowo kluczowe, takie jak „czysty”, poza społeczność C ++ w czasie, gdy funkcja była implementowana. Jest to opisane w jego książce The Design & Evolution of C ++ , sekcja 13.2.3:Stwierdza również wyraźnie, że nie musi to ustawiać wpisu vtable na NULL i że nie jest to najlepszy sposób implementacji czystych funkcji wirtualnych.
źródło
Podobnie jak w przypadku większości pytań „Dlaczego” dotyczących projektu C ++, pierwsze miejsce, na które należy zwrócić uwagę, to Projekt i ewolucja C ++ autorstwa Bjarne Stroustrup 1 :
1 §13.2.3 Składnia
źródło
Sekcja 9.2 standardu C ++ podaje składnię dla członków klasy. Obejmuje tę produkcję:
Nie ma nic specjalnego w tej wartości. „= 0” to po prostu składnia wyrażająca „ta funkcja jest czysto wirtualna”. Nie ma to nic wspólnego z inicjalizacją, wskaźnikami zerowymi lub wartością liczbową zero, chociaż podobieństwo do tych rzeczy może mieć wartość mnemoniczną.
źródło
= 0
Co jeszcze chciałbyś wiedzieć? Byłoby to tym samym, co pytanie, dlaczego treść funkcji jest opakowana w {} Odpowiedź byłaby taka, ponieważ to właśnie definiuje składnia C ++.Nie jestem pewien, czy ma to jakieś znaczenie. To tylko składnia języka.
źródło
C ++ zawsze unikał wprowadzania nowych słów kluczowych, ponieważ nowe zastrzeżone słowa łamią stare programy, które używają tych słów jako identyfikatorów. Często uważa się, że jedną z mocnych stron języka jest to, że w miarę możliwości szanuje stary kod.
= 0
Składnia może rzeczywiście zostały wybrane, ponieważ przypomina ustawienie vtable wpisu do0
, ale jest czysto symboliczny. (Większość kompilatorów przypisuje takie wpisy vtable do odgałęzienia, które emituje błąd przed przerwaniem programu.) Składnia została wybrana głównie dlatego, że nie była wcześniej używana i zapisała wprowadzenie nowego słowa kluczowego.źródło
pure
słowo kluczowe byłoby świetne w mojej książce. W każdym razie dobrze jest zrozumieć uzasadnienie.#define pure = 0
.C ++ musi mieć sposób na odróżnienie czystej funkcji wirtualnej od deklaracji normalnej funkcji wirtualnej. Zdecydowali się użyć
= 0
składni. Mogli po prostu zrobić to samo, dodając czyste słowo kluczowe. Ale C ++ nie chce dodawać nowych słów kluczowych i woli używać innych mechanizmów do wprowadzania funkcji.źródło
W tym przypadku nic nie jest „inicjowane” ani „przypisywane” zero.
= 0
tylko w konstrukcji składniowej składającej się z tokenów=
i0
, która nie ma absolutnie żadnego związku ani z inicjalizacją, ani przypisaniem.Nie ma związku z żadną rzeczywistą wartością w „vtable”. W języku C ++ nie ma pojęcia „vtable” ani nic podobnego. Różne „vtables” to nic innego jak tylko szczegóły konkretnych implementacji.
źródło
Pamiętam, jak czytałem, że uzasadnieniem zabawnej składni było to, że było to łatwiejsze (pod względem akceptacji standardów) niż wprowadzenie innego słowa kluczowego, które robiłoby to samo.
Myślę, że zostało to wspomniane w książce The Design and Evolution of C ++ autorstwa Bjarne Stroustrup.
źródło
Przypuszczam, że to tylko część gramatyki C ++. Nie sądzę, aby były jakieś ograniczenia co do tego, jak kompilatory faktycznie implementują to dla danego konkretnego formatu binarnego. Zakładasz, że prawdopodobnie było to właściwe dla wczesnych kompilatorów C ++.
źródło
= 0
Deklaruje czystą funkcję wirtualną .Nie sądzę, że to prawda. To tylko specjalna składnia. Tabela vtable jest zdefiniowana w ramach implementacji. Nikt nie mówi, że wpis vtable dla czystego elementu członkowskiego musi być w rzeczywistości wyzerowany podczas konstrukcji (chociaż większość kompilatorów obsługuje podobnie vtables).
źródło
= 0
robi to abstrakcja całej klasy i zabrania wirtualnych wywołań czystych funkcji. Nie-wirtualne wywołania są nadal całkowicie OK, czyli wtedy, gdy używana jest definicja (jeśli została podana).__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/… zamiast Base :: f ()Cóż, możesz także zainicjować wpis vtable, aby wskazywał na rzeczywistą funkcję "
Wydaje się intuicyjne, że wpis vtable można zdefiniować tak, aby wskazywał donikąd (0) lub do funkcji. Pozwolenie na określenie własnej wartości prawdopodobnie spowodowałoby, że wskazywałoby to na śmieci zamiast funkcji. Ale właśnie dlatego „= 0” jest dozwolone, a „= 1” nie. Podejrzewam, że Neil Butterworth ma rację, dlaczego w ogóle używa się „= 0”
źródło