Konstrukcija bazne klase stoga omogućava ili spriječava proširivanje javnim nasljeđivanjem.
Konstrukcija bazne klase stoga omogućava ili spriječava proširivanje javnim nasljeđivanjem.
Kod virtualnog nasljeđivanja nastaje situacija u kojoj do članice virtualne bazne klase ima više staza kroz stablo nasljeđivanja.
U ovom slučaju proširena klasa NamedVect nije trebala izvršiti pridruživanje varijabli iz proširenog dijela klase nakon što je bazni operator pridruživanja Vect:: operator = obavio svoj posao, no u općenitom bi slučaju na nakon poziva operatoru pridruživanja bazne klase došlo pridruživanje varijabli iz proširenog dijela klase.
Sada nekonstantan operator izbacuje izuzetak kod prekoračenja granice dok konstantan, koji je iz bazne klase, ne izbacuje.
Rezultat vezan uz nasljeđivanje je sljedeći: ako u proširenoj klasi preradimo samo jednu od više preopterećenih funkcija iz bazne klase niti jedna od preopterećenih funkcija bazne klase neće biti dostupna u proširenoj klasi (osim one koja je prerađena): kad je jednom ime funkcije nađeno u proširenoj klasi (unutarnji, lokalni doseg) ono više neće biti traženo u baznoj klasi (vanjski, globalni doseg).
Kada u izvedenoj klasi definiramo metodu iste signature (imena te broja i tipa argumenata) kakvu ima funkcija iz bazne klase onda kažemo da smo funkciju iz bazne klase preradili.
Zbog pravila dosega na objektu izvedene klase uvijek će biti pozvana metoda iz izvedene klase (prerađena metoda), a ne ona iz bazne klase.
Kako dvije metode imaju posve istu signaturu ukupan efekt je taj da je promijenjena implementacija metode iz bazne klase.
Dakle, ako želimo promijeniti implementaciju neke metode iz bazne klase samo trebamo tu metodu definirati u izvedenoj klasi i dati joj novu implementaciju.
Kod privatnog i zaštićenog nasljeđivanja prava pristupa elementima bazne klase postaju restriktivnija no što su to u baznoj klasi.
Pojedinoj metodi ili varijabli iz bazne klase možemo vratiti njena originalna prava pristupa u proširenoj klasi pomoću using deklaracije.
Kada se referenca (ili pokazivač) na tip bazne klase inicijalizira objektom proširene klase (ili adresom proširene klase) onda sam objekt proširene klase ne doživljava nikakvu promjenu; jedino bazna referenca (pokazivač) referira (pokazuje) na bazni dio objekta proširene klase.
Konstruktor bazne klase nije zavisan o eventualnim izvedenim klasama.
Pozivi baznim konstruktorima dešavaju se u inicijalizacijskoj listi, u poretku u kojem su bazne klase deklarirane.
Stoga u destruktoru nikada ne pozivamo eksplicitno destruktor bazne klase.
Kada se objekt bazne klase inicijalizira objektom proširene klase, onda dolazi do kopiranja onog dijela proširene klase koji pripada baznoj klasi u objekt bazne klase.
Doseg proširene klase je ugnježden u dosegu bazne klase.
To vrijedi i za proširenu klasu bez obzira da li bazne klase koriste vlastite ili sintetizirane članove.
Odluka o tome hoćemo li implementirati jednu od ove dvije funkcije (najčešće obje ili niti jednu) ovisi samo u proširenoj klasi, tj. neovisna je o sastavu bazne klase.
Izvedena klasa ne može direktno inicijalizirati članove bazne klase već ona u svojoj inicijalizacijskoj listi poziva odgovarajući konstruktor bazne klase, kao u našem primjeru.
Kada funkcija f dobije objekt proširene klase, umjesto objekta bazne klase, ona zove konstruktor kopije koji inicijalizira formalni argument funkcije.
Sada CCtor bazne klase obavlja inicijalizaciju formalnog argumenta.
Objekt proširene klase sastoji se od dva dijela: 1) podobjekta bazne klase (Vect) koji ima sve nestatičke varijable članice deklarirane u baznoj klasi i 2) nestatičkih varijabli deklariranih u proširenoj klasi (NamedVect).
Premda objekt proširene klase sadrži sve varijable bazne klase, pristup tim varijablama ovisi o pravima pristupa; isto vrijedi i za metode bazne klase (s time da metode članice nisu dio objekta (instance klase)).
Prava pristupa varijablama i metodama bazne klase određena su:
Isto proces se dešava kod pridruživanja objekta proširene klase objektu bazne klase, samo što se tamo poziva operator pridruživanja.
Javno sučelje bazne klase postaje ovdje privatnim dijelom izvedene klase, a ne njegovim sučeljem.
Kako privatne članice služe implementaciji klase možemo zaključiti da privatno nasljeđivanje treba koristiti kada klasu želimo implementirati koristeći funkcionalnost bazne klase.
Ako se u defaultnom konstruktoru izvedene klase ispusti konstruktor bazne klase iz inicijalizacijske liste, onda će prevodilac ubaciti poziv defaultnom konstruktoru bazne klase.
Tako na primjer u metodi update možemo pomoću obj.Window:: resize (x, y); pozvati metodu resize iz bazne klase neovisno o dinamičkom tipu reference obj.
Jezikoslovac je web odrednica na kojoj ćemo pokušati u skorije vrijeme objediniti sve varijante i baze koje su trenutno dostupne za hrvatski jezik, kao i što veći broj primjera za iste. Pratite nas i šaljite prijedloge, kako bismo postali centralno mjesto razmjene znanja.
Srdačan pozdrav!
All Rights Reserved © Jezikoslovac.com