Virtuális funkciók

2. rész Absztrakt osztályok és felhasználási példa

Folytassuk a cikk első részében megkezdett virtuális funkciók használatának fontosságát. Ezúttal konkrét példát kínálok Önnek. Legyen nagyon egyszerű, de teljesen működőképes, és lehetővé teszi, hogy bemutasson minden olyan finomságot, amiről már olvastad.
De az elején még van egy kis elmélet, amely nem szerepel az első részben.

Hálózati virtuális funkciók

Lehet, hogy úgy gondolja, hogy az összes többi funkció piszkos! Nem, természetesen. A tisztítás ebben az esetben szó szerint üres funkciót jelent. Lássuk, mi a tiszta virtuális funkció.

Mint látható, az egyetlen különbség csak az, hogy volt egy tervezési = 0, ami az úgynevezett tiszta adja meg. Egy tiszta virtuális funkció abszolút semmit nem tartalmaz, és nem áll rendelkezésre a hívások számára. Ennek célja, hogy szolgálják alapján (ha akarsz egy sablon) a csere funkciók származtatott osztályok. Egy legalább egy tiszta virtuális funkciót tartalmazó osztályt absztrakt osztálynak neveznek. Miért absztrakt? Mert lehetetlen létrehozni ebbe az osztályba tartozó független tárgyakat. Ez csak egy előkészület a többi osztály számára. A mechanizmus absztrakt osztályok célja, hogy képviselje az általános fogalmak, amelyeket aztán kéne megadni. Ezek az általános fogalmak általában nem lehet közvetlenül felhasználni, de lehet ezek alapján, hogy az alapján, hogy építsenek származékok magánórákat képes leírni konkrét tárgyakat.
Például? Kérem.

Minden állat a viselkedésükben olyan feladatokat lát el, mint az evés, ivás, alvás, hangzás. Lényeges meghatározni egy alaposztályt, amelyben azonnal kijelenthetjük ezeket a funkciókat, és tiszta virtuálisvá tehetjük őket. Ebből az osztályból olyan osztályok származnak, amelyek konkrét állatokat (vagy fajokat) írnak le sajátos viselkedésükkel. És az alap osztály valójában absztrakt. Végtére is, nem ír le sem több vagy kevésbé specifikus állatot (még az állatfajokat sem). Ez lehet a hal és a baromfi is különböző dolog!
Mint minden osztályhoz, egy absztrakt osztálynak is van egy kifejezetten meghatározott konstruktora. Az osztály módszereit hívhatja a konstruktornak. De a konstruktornak a tiszta virtuális függvényekhez való hívása hibát okoz a program végrehajtása során.
A rendes osztályokhoz képest az absztrakt osztályok korlátozott jogokkal rendelkeznek. Mint már említettük, lehetetlen létrehozni egy absztrakt osztály tárgyát. Az elvont osztály nem használható a függvényparaméter típusának, illetve a visszatérési érték típusának meghatározásához. Nem használható kifejezett öntvényekkel. De hivatkozásokat és mutatókat definiálhat absztrakt osztályokra.
Mindez, jól vagy szinte mindent, most egy példát tekintünk meg.

A legegyszerűbb program

Visszatérve a militáns példához az első részből, azt kell mondanom, hogy ebben az esetben teljesen békés, sőt egy gyerek példája is. By the way, annak minden egyszerűsége ellenére, talán ez lehet az alapja a legegyszerűbb fejlődő játéknak a kisgyermekek számára.
Hát akkor. Az ötlet az állatvilággal való ismerkedés alapja. (Cool kijelentette) Nem titok (remélem), hogy minden állat hangot ad. Különböző és nagyon jellemző a maga nemében. Erre és játszani.
A példa egyszerűsítése érdekében csak az egyes állatok leíró jellegét és az állat által előállított tipikus hangot írjuk le. Nos, a fő (és sajnos, az egyetlen) lehetőség a program lesz az output az állat becenevek és a bemutató hangok teszik.

Alap osztályként egy elvont osztályú állatot építettünk. Egyetlen címadattagja van, amely leírja az állat nevét. Van egy kifejezetten meghatáro- zott konstruktor, amely az állat nevét az állathoz rendelte. És az egyetlen tiszta virtuális funkció beszél (), amely leírja, hogy az állat milyen hangokat sugároz.
Ebből az osztályból az összes többi szerepel. Kivéve egy. Az osztály oroszlán született a macskaosztályból (végülis az oroszlánok is macskák!). Ezt a virtuális funkciók használatának bonyolultságát bizonyítják. De erről az osztályról egy kicsit később. És most hogyan működik a program.
Minden származtatott osztály leírja a saját virtuális funkciójukat () beszélő saját virtuális függvényt, amely kinyomtatja a képernyőt, milyen hangokat hall az adott állat.
A program fő részében az Állatfajta * mutatóinak állományait [4] nyilvánítják. És azonnal létrehozott dinamikus osztályobjektumokat, és töltött egy sor mutatót. És a () hurokban a virtuális függvény () szót () egyszerűen a mutató nevezi.
Ha a programba való belépéskor nem történt új hiba, a kimenetnek így kell kinéznie:

És a Borland C ++ 5 súgó rendszere a következő segítséget nyújtja:

Ez akkor fordul elő, ha egy helyettesítő virtuális funkciót azonos típusú visszatérési értékkel deklarálnak, de más paraméterekkel. Mi a hang, amelyet az oroszlán emittál, átadható paraméterként a talk () függvénynek? Az a feltételezés, hogy milyen helyet ad ki a hang, azonnal és visszavonhatatlanul eltört. Tegyük fel, hogy ez egy időfüggőség, azaz mikor. Nos, például közelebb az éjszakához, amikor az oroszlán el akarta aludni, és ámulni kezdett. Ezért ebben az esetben a When (int When) funkciót akkor adjuk át a When paraméterre, melyet a függvényben nem használunk, de ez nem számít. A funkció egyébként is működni fog.
Nos, miután elkészült a program, meg kell futtatnia. Mi történt? A következőknek kell lenniük:

Wow! Valami rossznak tűnik! Az oroszlán nem mormog, és nem ásít, de aranyos meowek. Miért? De a fordító figyelmeztette a funkciót 'Oroszlán :: beszél (int)' elrejti (felülbírálja) a virtuális funkciót 'Cat :: speak ()'. Ez egy teljesen más funkció! Ezért, ha nincsen jól definiált virtuális függvény ebben az osztályban, akkor a mutató hívja a virtuális függvényt () az alaposztályból. És a mi esetünkben az Oroszlánosztály alapkategóriája a Cat osztály. Itt egy oroszlán rád és zamyukal!

Itt, eddig, ez minden. Elvégeztük a virtuális funkciók elméletének elemzését általában. Azonban nem vettünk figyelembe sok különböző pontot. De ezek már nagyon finom finomságok. Erről egész könyvet tudsz írni.
A következő részben megpróbálunk egy kicsit bonyolultabb pillanatot megvizsgálni. Lássuk, mi a virtuális osztálybontó, miért van szükségük, és hogyan kell kezelni őket.

Kapcsolódó cikkek