Vrlo interesantno pitanje. Odgovor koji cu pokusati da ti dam je samo radi davanja ideje posto nisam siguran da li sam u pravu posto ovakvu implementaciju jos nisam video a kamoli koristio:)
Modifieri pristupa, kada se koriste u kontekstu nasledjivanja, menjaju access ka spoljasnjem svetu, analogno modifierima pri definisanju clanica klase.
Tako da je moguce da, kada si naknadno primenio public pristup prilikom deklarisanja 'class Specijalac: public Ratnik, public Obicni' promenio pristup iz protected u public.
Sto se tice ovoga:
Code:
Osoba *pokaziva = &ratn;
Protected pristupom si ucinio operator 'address of (&)' protected tako da ti kompajler javlja gresku oko pristupa tom operatoru, koji je, cini mi se, implicitno implementiran (analogno default konstruktorima i assignment operatoru).
Ako ubacis ovaj kod u Ratnik klasu, kompajlirace se:
Code:
public:
Osoba* operator&()
{
return this;
}
Moj savet je da izbegnes multiple inheritance kada god mozes i da koristis kompoziciju kada dodje do situacija da moras da koristis mult. inh. osim ako bazne klase nemaju ulogu interfejsa. Naravno, ni kompozicija nije silver bullet ali je, bar po meni, bolji dizajn jer je lakse raditi na taj nacin.
Code:
class Specijalac : public Ratnik
{
Obicni* m_pObicni;
public:
// funkcije od interesa iz Ratnika koristis ili overrideujes a funkcije iz m_pObicni delegiras
};