2010-12-12 23 views
16

W Javie, zamiast za pomocą operatora zakresu, super służy ex:C++ odpowiednik "super"?

C++ -> GenericBase::SomeVirtualFunction(); 
Java -> super.someVirtualMethod(); 

Czy istnieje coś takiego w C++ lub nie ma sensu w C++ ze względu na wielokrotne dziedziczenie?

Dzięki

+2

Nie znam żadnego odpowiednika "base" lub "super" w C++. Musisz jawnie użyć nazwy klasy nadrzędnej. – CodesInChaos

+7

Myślę, że odpowiedziałeś na własne pytanie. – someguy

+0

__super w MSVC. Dwa podkreślenia, aby upewnić się, że nie jest to standardowe. –

Odpowiedz

4

Nie ma czegoś takiego w C++, chociaż można podać własną typedef:

struct Derived : Base 
{ 
    typedef Base super; 
}; 
+1

Zobacz odpowiedź @wqking, która zaleca umieszczenie polecenia typedef w sekcji "private:". – aldo

5

Kompilatory Microsoft mają (odrzucone przez C++ standardowe commitee) rozszerzenie __super.

Edycja: Super może mylić czytelników kodu. Z powodu wielokrotnego dziedziczenia w C++ lepiej jest być bardziej wyraźnym. Wielokrotne dziedziczenie jest już skomplikowane. Była dyskusja AFAIK na temat przydatności superu do szablonów, które uspokoiły się po tym, jak uświadomiono sobie, że każdy może wpisać super, jeśli tego potrzebuje.

+0

Jakieś uwagi na temat odrzucenia tego przez komisję normalizacyjną? (Nie zdawałem sobie sprawy, że to jest jeszcze do rozważenia ...) –

+2

Używam również słowa kluczowego __super, bardzo pomaga, jeśli zmieniasz klasy bazowe i takie tam. Zwłaszcza w MFC. Szkoda, że ​​to nie jest standardowa, bardzo przydatna funkcja. – Coder

5

Sztuką typedef w linku Marcina działa całkiem dobrze (i to częściowy powód, dlaczego C++ nie posiada super-lub odziedziczony keywork AFAIR.) Jedyne co musimy się martwić o to, że typedef powinno być w sekcji prywatnej . Nie umieszczaj go w chronionej lub publicznej sekcji, w przeciwnym razie klasa pochodna może błędnie używać typedef, aby odnieść się do dziadka, a nie do rodzica.