cplusplus dedeni
xPablo
Pablo na xpablo.cz
Neděle Září 10 10:30:35 CEST 2023
Bohuzel Tome, dle Vasi odpovedi soudim, ze jste to nepochopil - pokusim
se to podrobneji rozepsat (omlouvam se za HTML format mailu, ale myslim,
ze to je dulezite pro prehlednost).
V puvodnim mailu jste poslal zdrojovy kod, ktery rozebereme:
class basecls {
public:
static const int testvar =100;
V tomhle okamziku jste to podelal - naridil jste totiz kompilatoru, aby
vytvoril jednu jedinou promennou pro vsechny instance tridy basecls i
jeji potomky, ktera bude mit jmeno basecls::testvar a konstantni (R/O)
hodnotu 100.
int getval() {
return testvar;
}
Tady jste napsal metodu, ktera ma vracet hodnotu testvar. Kompilator, na
zaklade Vaseho povelu si to vysvetli jako: aha, mam vratit
basecls::testvar, tedy zjednodusene return basecls::testvar; , ale ona
to je konstanta, tedy return 100; Tohle je presne to, co kompilator
prelozi - muzete si to snadno overit na godboltu:
Vsimnete si prosim "mov eax,100"... Kompilator IMO nema jinou moznost,
jak si Vas zapis vysvetlit.
class childcls :public basecls {
public:
static const int testvar =200;
};
si kompilator vysvetli jako: Vytvor jednu jedinou promennou pro vsechny
instance childcls, ktera bude mit jmeno childcls::testvar a bude mit
konstantni (R/O) hodnotu 200.
Kdyz to tedy shrnu, tak mate promennou basecls::testvar = 100,
childcls::testvar = 200 a metodu basecls.getval(), ktera bude vracet
konstantni hodnotu 100. V teto chvili jsem Vam napsal, ze getval() neni
virtual a nema override/final, takze to nebude fungovat - respektive to
nebude delat to, co jste si "myslel", ale to, co jste napsal.
Kdybyste totiz ten kod napsal takto:
class basecls {
public:
int testvar =100;
int getval() {
return testvar;
}
};
class childcls :public basecls {
public:
childcls() {
testvar =200;
}
};
tak bude fungovat vsechno tak, jak jste ocekaval.
Ja jsem ve svem prikladu udelal chybu v tom, ze jsem se snazil zachovat
to const (R/O promennou) a neuvedomil jsem si, ze se da inicializovat
jen jednou. Pro zajimavost, pokud chcete dodrzet tu R/O vlastnost, tak
by kod mohl vypadat takto:
class basecls {
public:
const int testvar =100;
basecls() =default;
explicit basecls(int tv) :testvar(tv) {
}
int getval() {
return testvar;
}
};
class childcls :public basecls {
public:
childcls() : basecls(200) {
}
};
tak, ted jen doufam, ze to projde konfrenecnim mail serverem bez
poskozeni a ze je moje vysvetleni dostacujici...
Pavel Brychta
Dne 08. 09. 23 v 14:52 Tomas Chvatal napsal(a):
>
> Dekuji. S tou static prom. jsem to uz pochopil.
> zkousim kod co posilate:
> classbasecls {
> public:
> inttestvar;
> basecls() : testvar(100) {}
> intgetval() {
> returntestvar;
> }
> };
> classchildcls : publicbasecls {
> public:
> //int testvar;
> childcls() : testvar(200) {}
> };
> a pri compilaci hlasi na radku childcls() : testvar(200) {}:
>
> error C2614: 'childcls' : illegal member initialization: 'testvar' is
> not a base or member
>
> Nechapu, proc nemuze inicializovat vlastnost ktera je z basecls zdedena ?
>
> Pokud ale constructor v childcls prepisu takto, tak uz to projde a i
> spravne funguje:
>
> childcls() {
> testvar = 200;
> }
> Proc?
> >Jenomze jste tomu potomkovi tu metodu neprepsal, ale volate metodu predka
> A proc musim neco PREPSAT ? Neni jednim z principu objektoveho
> programovani DEDICNOST ?
> Cekal bych, ze kdyz predek neco umi, ze to automaticky pak umi i
> potomek, ale pracuje samo. s hodnotami
> svych "mladsich" vlastnosti/promennych.
> Rad bych do toho obj.chovani ++ka nejak vice proniknul. Pak clovek tak
> nejak lepe vi, jak psat zdravejsi
> a ve vysledku i rychlejsi a mensi kod.
> Mne by zajimalo, JAK je to MYSLENE. Co vede k tomuto, dle meho,
> divnemu chovani.
> Neprijde vam to nelogicke ?
> s přáním hezkého dne / best regards
> Tomáš Chvátal
> tchvatal na fordiag.cz
>
> ----- Původní zpráva -----
> *Od:* Pablo na xpablo.cz
> *Komu:* HW-news <mailto:hw-list na list.hw.cz>
> *Odesláno:* 8. září 2023 12:09
> *Předmět:* Re: cplusplus dedeni
>
> Jenomze jste tomu potomkovi tu metodu neprepsal, ale volate metodu
> predka, ktery ma jasne dane to, ze vrati hodnotu, kterou ma
> vratit. V tom priklade v jazyku, ktery jste poslal neni zadny
> static. I V c++ to jde napsat stejne, ale musite vedet, co delate...
> class base {
> protected:
> const int testvar;
> public:
> base() : testvar(100) {}
> int getval() {
> return testvar;
> }
> };
>
> class child : public base
> {
> public:
> child() : testvar(200) {}
> };
> by mohlo fungovat (pisu to z ruky, takze bez naroku na spravnost...)
> --
> Pavel Brychta
> http://www.xpablo.cz
>
> ---------- Původní e-mail ----------
> Od: Tomas Chvatal <tchvatal na fordiag.cz>
> Komu: HW-news <hw-list na list.hw.cz>
> Datum: 8. 9. 2023 12:01:43
> Předmět: Re: cplusplus dedeni
>
>
>
> >takze chcete po predkovi (tride basecls),
> Ja to preci chci v jednom dotazu po predkovi, ale v druhem po
> potomkovi.
> A prave se divim, ze i ten potomek vraci hodnotu z predka.
> Spatne to mozna je, ale ve videni c++ ;-)
> VFP kod:
> define class base as custom
> testvar = 100
> proc getVal
> return this.testvar
> endproc
> enddefine
> define class child as base
> testvar = 200
> * metodu getVal tady nemusim nijak zminovat, protoze jsem
> ji zdedil (a jeji umeni) od predka
> enddefine
> obj = createobject('child')
> ? obj.getVal()
> vypise, pro mne logicky a dobre, 200
> Z meho pohledu - predek to dite naucil "vratit hodnotu sveho
> testvar" a to dite ma tu hodnotu JINOU nez predek.
> s přáním hezkého dne / best regards
> Tomáš Chvátal
> tchvatal na fordiag.cz
>
> ----- Původní zpráva -----
> *Od:* Pablo na xpablo.cz
> *Komu:* HW-news <mailto:hw-list na list.hw.cz>
> *Odesláno:* 8. září 2023 11:48
> *Předmět:* Re: cplusplus dedeni
>
> No uz z principu ne - ten getter (getval()) neni virtual a
> ani neni override, takze chcete po predkovi (tride
> basecls), aby vratil hodnotu potomka. Proste to je spatne.
> Vsadim se, ze basecls::testvar a childcls::testvar budou
> vracet spravne hodnoty (i kdyz bych predpokladal aspon
> varovani pri prekladu ze tam jedna promenna ma/dela stin
> druhe).
>
> --
> Pavel Brychta
> http://www.xpablo.cz
>
> ---------- Původní e-mail ----------
> Od: Tomas Chvatal <tchvatal na fordiag.cz>
> Komu: HW-news <hw-list na list.hw.cz>
> Datum: 8. 9. 2023 11:44:02
> Předmět: Re: cplusplus dedeni
>
>
> Jak predek, tak potomek maji stejnou promennou (tady
> se tomu nerika
> vlastnost ?)
> Tedy u potomka, ktery ma napr. jiny "obvod hlavy" bych
> cekal, ze umi
> odpovedet spravnou hodnotu sve hlavy ;-)
>
> s přáním hezkého dne / best regards
> Tomáš Chvátal
> tchvatal na fordiag.cz
>
> ----- Původní zpráva -----
> Od: "Jaroslav Buchta" <jaroslav.buchta na hascomp.cz>
> Komu: <hw-list na list.hw.cz>
> Odesláno: 7. září 2023 19:32
> Předmět: Re: cplusplus dedeni
>
>
> Asi chybi virtual, ale to jde asi stejne jen na
> metody. Jak by predek
> mohl vedet o promene potomka?
>
> Dne 07.09.2023 v 19:28 Tomas Chvatal napsal(a):
> > Zdravim.
> >
> > Muze se mi, prosim, nekdo pokusit vysvetlit, jak je
> to v C++ mysleno s
> > "dedenim" vlastnosti ?
> > Jsem "tridne postizeny" z VFP a ted jsem u c++ dost
> zmateny ;-)
> >
> > Mam tridu "basecls" (ta ma metody getval())
> > Od ni dedim do druhe tridy "childcls". V te mam
> vlastnost testvar
> > predefinovanou na jinou hodnotu.
> > class basecls {
> >
> > public:
> >
> > static const int testvar=100;
> >
> > int getval() {
> >
> > return testvar;
> >
> > }
> >
> > };
> >
> > class childcls : public basecls {
> >
> > public:
> >
> > static const int testvar=200;
> >
> > };
> >
> >
> > std::cout << base.getval() << std::endl;
> >
> > std::cout << child.getval() << std::endl;
> >
> >
> >
> > Proc se mi pri volani getval() na obou objektech
> > vraci vzdy 100 ?
> >
> > Mate nejaky odkaz na pekne vysvetleni jak to s tim
> dedenim zde je ?
> > Jsem jenom tak ovlivnen od jinych jazyku, nebo je to
> s temi tridami v c++
> > takove nejake divne, az hnusne ? ;-)
> >
> > Diky predem.
> >
> > s přáním hezkého dne / best regards
> > Tomáš Chvátal
> > tchvatal na fordiag.cz
> >
> > _______________________________________________
> > HW-list mailing list - sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> ------------------------------------------------------------------------
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> ------------------------------------------------------------------------
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list - sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
--
Pavel Brychta
tel: +420 604 377 666
http://www.xPablo.cz
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230910/3b7336d0/attachment-0001.htm>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: Snímek obrazovky z 2023-09-10 10-06-53.png
Type: image/png
Size: 80933 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230910/3b7336d0/attachment-0001.png>
Další informace o konferenci Hw-list