Dedenie – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Dedenie – C / C++ – Fórum – Programujte.comDedenie – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
vit
~ Anonymní uživatel
18 příspěvků
26. 2. 2011   #1
-
0
-

Mam jeden "problem". Potreboval by som vysvetlit nasledujuci kod:



#include "iostream"
using namespace std;

class B{
public:
virtual void fun(){cout << "B::fun()" << endl;}
};

class D : public B{
private:
void fun(){cout << "D::fun()" << endl;}
};
int main()
{
D d;
B *x= &d;

x->fun();

return 0;
}

Tento program po spusteni vypise: "D::fun()"
To znamena ze verejna virtualna metoda v zakladnej triede B je redefinovana privatnou metodou z D. Tym padom ked vytvorim pointer zakladnej triedy B* a neham ho ukazovat na odvodenu triedu typu D, tak po zavolani metody fun() cez pointer B* z main() (main nie je clenom ani friendom ziadnej z tried B, D) sa zavola privatna metoda z D. Znamena to ze pri vytvarani virtualnych tabuliek metod sa neberu do uvahy pristupove prava public/privat/protected alebo ako to vlastne funguje? :)

Nahlásit jako SPAM
IP: 95.105.128.–
Reklama
Reklama
KIIV+42
God of flame
26. 2. 2011   #2
-
0
-

To vit : virtual znamena, ze se vyhodnocuje volani metody az za behu -> zjisti se tedy co je to doopravdy za tridu (typ objektu) a podle toho se zvoli spravna metoda.. kdyby si nemel virtual, tusim ze by to zavolalo B::fun (tim si ted nejsem uplne jist)

jo muzes si nekde najit neco o polymorfizmu...
(neco ve stylu ze mas N ruznych objektu odvozenych od hlavni tridy a pak je muzes hodit do jednoho pole typu jako rodic... u kazde muzes mit jiny druh vypisu pres stejnou metodu - a pak treba projdes pole a u kazdeho volas metodu -> ta vykona spravny kod)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Grungy0
Super člen
26. 2. 2011   #3
-
0
-

Myslím že on sa skôr pýtal na to, ako je možné že to zavolá private metódu, čo by aj mňa dosť zaujímalo.

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
KIIV+42
God of flame
26. 2. 2011   #4
-
0
-

To Grungy : jo sem si nevsiml.. predpokladam ze primo ji zavolat nemuze, ale pro B je verejna, takze tam uz si zjistit co volat muze

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vit
~ Anonymní uživatel
18 příspěvků
26. 2. 2011   #5
-
0
-

To Grungy :
Presne tak, ale uz som asi zistil cim to bude.
Volanie virtualnych tried sa robi cez tebulky virtualnych metod (pekne vysvetlene tu: http://www.learncpp.com/cpp-tutorial/125-the-virtual-table/)
Tieto vtables neuchovavaju udaje o pristupovych pravach, cize prekladac vyuzie pristupove prava triedy z ktorej je metoda volana.
V mojom priklade bola metoda volana z triedy B. V tejto triede je B verejna a to ze v skotocnosti sa pouzie trieda D kde je privatna nemal prekladac ako zistit. Ale je zaujimave ze sa to da takto okaslat :)

Nahlásit jako SPAM
IP: 95.105.128.–
Grungy0
Super člen
27. 2. 2011   #6
-
0
-

Tak toto je teda dosť veľká diera do zapuzdrenia. Chcel by som vedieť či to autori tak zamýšľali a je to k niečomu dobré, alebo len nedomysleli tento aspekt.

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
nervak0
Věrný člen
27. 2. 2011   #7
-
0
-

Jaká díra? Je to naprosto v pořádku.

Nahlásit jako SPAM
IP: 213.211.51.–
Grungy0
Super člen
27. 2. 2011   #8
-
0
-

To nervak : Je to minimálne čudné, že dokážeš mimo triedy zavolať private metódu. Však keď deklarujem nejakú metódu ako private hovorí to o nej že sa použije len na nejaké veci v implementácii rozhrania ktoré nemusia nikoho iného zaujímať a tento spôsob to obchádza.
Alebo mi niečo nedochádza? Budem rád ak ma poučíš, prečo je to v poriadku.

Nahlásit jako SPAM
IP: 188.123.100.–
Prvý náznak hlúposti, je pocit geniality.
nervak0
Věrný člen
27. 2. 2011   #9
-
0
-

sa použije len na nejaké veci v implementácii rozhrania ktoré nemusia nikoho iného zaujímať

Copak tohle je nějaká vedlejší metoda, která nemusí nikoho zajímat?

D je implementace B, a když je tak použita, tak platí deklarace B.

Nahlásit jako SPAM
IP: 213.211.51.–
Grungy0
Super člen
28. 2. 2011   #10
-
0
-

To nervak : Aha díky už mi došlo o čom to je.

Nahlásit jako SPAM
IP: 158.193.84.–
Prvý náznak hlúposti, je pocit geniality.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 189 hostů

Podobná vlákna

C++ dedenie triedy — založil Marbulinek

Dedenie a vlakna — založil vreckovka

Dedenie z interfacu — založil mnn

Dedenie vlastnej class — založil bozole_sk

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý