W C++ istnieje słowo kluczowe using
, z którym zetknął się chyba każdy. Zwykle dotyczy to nieśmiertelnej linijki:
Dlatego też słowo to kojarzy się przede wszystkim z przestrzeniami nazw (namespaces), a najczęściej tylko i wyłącznie z nimi.
Jednak using
ma też swoje zastosowanie – i to zapewne znacznie ciekawsze – przy definiowaniu klas. Formalnie rzecz ujmując, słówko to pozwala wprowadzić składową pochodzącą z klasy bazowej (metodę lub pole) do zasięgu klasy pochodnej. Niezbyt to ekscytujące na pierwszy rzut oka, ale faktem jest, że dzięki skorzystaniu z using
możemy dokonać przynajmniej jednej koniecznej czasami operacji. Możliwa jest mianowicie zmiana kontroli dostępu do danego składnika klasy, czyli określenie, czy ma on być prywatny czy może publiczny.
Wyobraźmy sobie na przykład, że w klasie bazowej mamy jakieś funkcje niepubliczne, które chcemy udostępnić na zewnątrz w klasie pochodnej:
Sytuacja nie jest wcale taka hipotetyczna. Sam miałem ostatnio taki przypadek, gdy najwygodniej było po prostu wbudować w klasę bazową pewną ukrytą funkcjonalność, która była używana przez wiele z jej klas pochodnych do ich wewnętrznych celów. Jednak niektóre z tych klas musiały tę “bazową” funkcjonalność udostępnić na zewnątrz jako publiczną. I tu przydało się użycie using
w sposób zaprezentowany wyżej. (Dla zainteresowanych wspomnę, że opisywana sytuacja praktycznie wystąpiła u mnie w kodzie systemu GUI :]).
Mi sie zawsze wydawalo, ze usign moze aby przywrocic dostep z klasy bazowej czyli w takiej sytuacji:
Jeżeli sie myle to mnie poprawcie :P
Ooo ciekawe ;>
Dobrze wiedzieć ;>
Kwazar: Jak najbardziej tak. To co opisałem, to tylko jedno z “pozanamespace’owych” zastosowań using. Ty podałeś drugie (w gruncie rzeczy dość podobne do pierwszego, bo w Foo metoda Fun() jest prywatna i też używasz using
do jej upubliczenia). Trzecim zastosowaniem jest przeciążenie metody odziedziczonej w klasie pochodnej zamiast jej ukrywania. Czwarte pojawi się w C++0x i będzie polegało na możliwości “dziedziczenia” (albo raczej automatycznego generowania) konstruktorów.
Być może istnieją też i inne przypadki podobnego użycia using
, ale jak dotąd o nich nie słyszałem :) (Co aczkolwiek nie jest żadnym argumentem za tym, że ich nie ma :>).
akurat takiego czegoś kiedyś potrzebowałem i zastanawiałem się czy to jest możliwe thx:)
Nie no czy kiedyś skończą Ci się sztuczki z rękawa?:D
Kwazar też mi się to wydawało podejrzane :),sprwadziłem metodą Xiona i działało! :)
Czyli w ten sposob mozna np w jakiejs klasie engina graficznego dostac sie do wszystkich skladnikow prywatnych :D
Nie można. Składniki prywatne nie są dziedziczone, więc zrobienie klasy pochodnej dziedziczącej po klasie “z engine’u” nic nie da.
Fakt sprawdzilem teraz w visualu i rzeczywiscie nie da rady.