Kezdőoldal » Számítástechnika » Programozás » Az hogyan lehetséges, hogy...

Az hogyan lehetséges, hogy egy Y (ez a bázistípus) típus copy konstruktora elfogadja az X származtatott osztály objektumát?

Figyelt kérdés

cMammal::cMammal(const cMammal &rhs):

i_age(new ushort(rhs.i_getAge())),

i_weight(new float(rhs.i_getWeight())) { cout << "cMammal copy construcotr \n" ; }


cDog::cDog(const cDog& rhs):

cMammal(rhs), //Itt az rhs egy cDog típusra egy hivatkozás ez a cDog típus származtatva van cMammal-ból.

i_breed(new BREED(rhs.i_getBreed())) { cout << "cDog copy constructor \n" ; }


2012. okt. 7. 23:17
 1/9 A kérdező kommentje:

Hogyha egy bázisosztály másoló konstruktor bázistípusú objektumot vár vagyis erre fog hivatkozást készíteni,akkor az hogy lehet hogy a bázisosztály másoló konstruktora elfogad nem bázis osztály típust is?


vagy ez nem így van csak származtatott osztály típusát fogadja el?

2012. okt. 7. 23:40
 2/9 A kérdező kommentje:

Megpróbálom minél érthetőbben elmagyarázni.

Az öröklődésnél minden rendben működik akkor amikor egy bázisosztály másolókonstruktorának akarok át adni egy származtatott típust.


Ha nincs öröklődés akkor ez nem működik.

Miért van az hogy öröklődés esetében egy bázisosztály másoló konstruktora elfogad egy származtatott osztály típust?

2012. okt. 8. 00:26
 3/9 iostream ***** válasza:

Elméleti szinten, OOP szemszögből: a cDog egyben cMammal is, az öröklődés azt fejezi ki, hogy a kutya egy emlős, néhány speciális tulajdonsággal, tehát ahol emlőst lehet használni, ott kutyát is.

Gyakorlati szemszögből: a cDog osztály tartalmaz egy cMammal osztályt, minden adattagjával és tulajdonságával együtt, és mivel a referenciák upcastolhatók (azaz leszármazott osztály referenciája (és mutatója is) implicit és kussban konvertálódik bázisosztály referenciájává (ez is igaz mutatóra).


Tehát amikor te átadod az rhs-t, az olyan, mintha ezt írnád:

(cMammal&)rhs

2012. okt. 8. 10:04
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:

Mi az az upcastolás?

Nem találom a neten azt,hogy mit csinál az aki upcastol.

2012. okt. 8. 22:22
 5/9 A kérdező kommentje:

Már tudom mi az a down csat pedig az,hogy vissza convertálom az eredeti típusára igaz?


ha akarom ki is írhatom nem fogja ettől a fordító kétszer upcastolni a hivatkozást.


Vagy ha nem írom oda a típuskényszerítést akkor a fordító majd oda teszi magától így:

cMammal((cMammal&)rhs),

2012. okt. 8. 22:46
 6/9 iostream ***** válasza:
Inkább így: cMammal&(rhs). Ugye a C++-ban nem érték vagy referencia szerinti paraméterátadás van, hanem inicializáció szerinti. Megpróbálja létrehozni a cMammal típusú referenciát abból, amit odaírsz. cDog referenciából ez könnyedén sikerül neki, nem kell csinálni semmit.
2012. okt. 8. 22:56
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:

Adtam zöld kezet amúgy.

Azt hiszem ki fogom írni a típuskényszerítést én magam az öröklődéskor bár nem muszáj mert a fordító ezek szerint elvégzi helyettem.


De ha akarom ki írhatom nem lesz rosszabb tőle a program ugye?Olyan mintha a default konstruktort is én magam mindig megírnám.


Nem fog kétszer konvertálni a programom ez miatt?

2012. okt. 8. 22:57
 8/9 A kérdező kommentje:

cMammal::cMammal(const cMammal &rhs):

i_age(new ushort(rhs.i_getAge())),

i_weight(new float(rhs.i_getWeight())) { cout << "cMammal copy construcotr \n" ; }


cDog::cDog(const cDog& rhs):

cMammal((cMammal&)rhs), //Így értettem.

i_breed(new BREED(rhs.i_getBreed())) { cout << "cDog copy constructor \n" ; }

2012. okt. 8. 23:07
 9/9 iostream ***** válasza:

No. A default konstruktort ha megírod, annak vannak más hatásai is, de lényegében ugyanaz.


És van egy jó hírem is: pointereket, referenciákat konvertálni kétszer is pontosan ugyanannyi, mint egyszer: ugyanis 0 időbe kerül. A típusok csak fordítási időben léteznek, futási időben egy pointernek nincs típusa, sőt, nincs is igazán különbség egy pointer, és egy ugyanakkora méretű beépített típus között.

2012. okt. 9. 09:46
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!