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