Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.



Hasonló dokumentumok
Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

Java programozási nyelv 4. rész Osztályok II.

Programozási alapismeretek 4.

Osztályok. 4. gyakorlat

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Programozás II. 4. Dr. Iványi Péter

C++ programozási nyelv Konstruktorok-destruktorok

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Java programozási nyelv 5. rész Osztályok III.

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Programozás C++ -ban

JAVA PROGRAMOZÁS 2.ELŐADÁS

Interfészek. PPT 2007/2008 tavasz.

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

C++ programozási nyelv Struktúrák a C++ nyelvben

Programozás II. 6.Öröklés Dr. Iványi Péter

Globális operátor overloading

Objektumorientált programozás C# nyelven

Pénzügyi algoritmusok

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Java és web programozás

OOP. Alapelvek Elek Tibor

Programozási nyelvek Java

Már megismert fogalmak áttekintése

Objektumok inicializálása

Objektumorientált szoftverfejlesztés alapjai

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

Öröklés és Polimorfizmus

Java és web programozás

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Bevezetés, a C++ osztályok. Pere László

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Programozás C++ -ban

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Programozás C++ -ban 2007/7

Programozás módszertan p.1/46

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Programozás II gyakorlat. 8. Operátor túlterhelés

Programozás BMEKOKAA146. Dr. Bécsi Tamás 7. előadás

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

ISA szimulátor objektum-orientált modell (C++)

Osztály és objektum fogalma

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

OOP #14 (referencia-elv)

Programozás módszertan

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Bevezetés a Python programozási nyelvbe

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

C++ programozási nyelv

3. Osztályok II. Programozás II

Származtatási mechanizmus a C++ nyelvben

500. AA Megoldó Alfréd AA 500.

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Bevezetés a programozásba Előadás: A const

Objektumorientált programozás C# nyelven

Virtuális függvények (late binding)

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

C++ programozási nyelv

Elemi Alkalmazások Fejlesztése II.

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

III. OOP (objektumok, osztályok)

Számítógép és programozás 2

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

5. Gyakorlat. struct diak {

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Programozás II. 2. Dr. Iványi Péter

Objektumorientált programozás C# nyelven

OOP #1 (Bevezetés) v :39:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Programozás C++ -ban 2007/4

Java III. I I. Osztálydefiníció (Bevezetés)

Programozás C++ -ban

Java III. I I. Osztálydefiníció (Bevezetés)

Objektumelvű programozás

Bevezetés a programozásba előadás: Öröklődés

C++ programozási nyelv Konstruktorok Gyakorlat

Programozási nyelvek Java

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

4. Öröklődés. Programozás II

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

C++ programozási nyelv

Objektumorientált programozás IX. Osztályok, objektumok

Programozás II gyakorlat. 6. Polimorfizmus

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

OOP: Java 8.Gy: Abstract osztályok, interfészek

Java és web programozás

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Átírás:

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés. Az osztály egy olyan típus leíró struktúra, amely tartalmaz adattagokat és metódusokat, amelyek segítségével az adattagokon műveleteket végezhetünk. Az osztályt, mint típust új objektumok definiálására használjuk, hogy azzal további műveleteket végezzünk. Emellett maximálisan támogatja az öröklődést, a polimorfizmust(virtuális függvények) és az egységbezárást, amik az objektum orientált programozás alapkövei. A példában a Rajzol, VonalRajzol egy elképzelt függvény, KisNyul is lehetne a helyén. Szemléltetésre szolgál. class CTeglalap int Jobb; int Also; ; A Bal, Felso, Jobb, Also változókat adattagoknak, a Rajzol metódust pedig tagfüggvénynek nevezzük. Egy osztálydefiníció egy új típust hoz létre,. Az osztály használatához létre kell hozni a típushoz tartozó objektumot. Ezt nevezzük az osztály példányának. Az osztály objektumát a beépített típusokba tartozó változókhoz hasonlóan vehetjük fel. Másik megoldással, ha dinamikusan akarjuk létrehozni és törölni, akkor a new és delete operátorokkal tehetjük ezt meg. CTeglalap Tegla; Ez a CTeglalap egy példányát(objektumát) hozza létre. Ez automatikusan memóriát foglal le az objektum(példány) részére, és már lehet is vele műveletet végezni. A példány megsemmisülése automatikusan fog történni. CTeglalap *Tegla = new CTeglalap; Ez a CTeglalap egy példányát(objektumát) dinamikusan hozza létre. Mi saját magunk memóriát foglalunk le az objektum(példány) részére, és már lehet is vele műveletet végezni. A példány megsemmisülése mi általunk vezérelten fog történni,nem LESZ AUTOMATIKUS a megsemmisülés. Az objektum mindaddig foglalt marad, amíg mi azt explicit módon(kívülről) fel nem szabadítjuk a delete operátor segítségével. delete Tegla; Egy osztályból tetszőleges példányt(ameddig a memória bírja) hozhatunk létre. A tagokat a. vagy -> operátorral érhetjük el a C struktúrák elemeihez hasonlóan. Az osztály tagjainak elérhetőségét a protected, public és private hozzáférés módos1tókkal állíthatjuk be. Alapértelmezésként minden osztályon belüli tag, ha külön nem adjuk meg private-nak minősül. Az egységbezárás elvének megfelelően a hozzáférés-módosítókkal védjük meg az osztály felhasználójától az osztály belső felhasználásra szánt adatait. Írhatunk persze olyan tagfüggvényeket, amelyek a felhasználó által beadott adatok alapján módosíthatják a védett adattagokat. Másik előnye, hogy a belső adatstruktúrák korlátozottsága miatt az osztály szerzője megváltoztathatja az adatszerkezetek felépítését, anélkül, hogy az osztályt használó programrészen változtatni kellene. A lényeg az, hogy a publikus tagfüggvények hívási módja legyen változatlan. Jelenlegi definíciójával az osztályunk le fog fordulni szépen, csak éppen a példányával nem fogunk tudni dolgozni, mivel a CTeglalap minden adattagja és tagfüggvénye automatikusan private-ként jött létre. class CTeglalap int Jobb; int Also; ; 1

Így már hozzáférhetünk minden adattaghoz és függvényhez: CTeglalap Tegla; Tegla.Bal = 5; Tegla.Felso = 10; Tegla.Jobb = 100; Tegla.Also = 150; Tegla.Draw(); A gond az, hogy az egységbezárás(encapsulation) elve nem érvényesül. Ezen alapelv szerint az osztály belső mechanizmusainál használt adatstruktúrákat az osztály használójának nem kellene látnia, mert neki csak a rajzolás a fontos, hogy mi van mögötte az a felhasználónak nem számít, csak rajzoljon a függvény egy téglalapot és kész. Azonban most mindenhez hozzáfér és ez nem szerencsés. Megoldás: class CTeglalap int Jobb; int Also; ; Itt a private kulcsszóra nem is lenne szükségünk, mivel automatikusan private lenne, de jobban olvasható a kód. Itt azonban felmerül egy másik gond, nevezeten, mivel a példányban(objektum) nem tudunk hozzáférni a belső adattagokhoz, valami értelmetlent fogunk rajzolni vagy lehet, hogy a program szabálytalan műveletet fog végrehajtani. A teendő egy publikus függvény megírása, amely beállítja a belső adattagokat a Rajzol függvény használatára. void SetKoordinatak(int a, int b, int c, int d) Bal = a; Felso = b; Jobb = c; Also = d; Itt a private részben akár meg is változtathatnánk az adattagokat: int Szelesseg; int Magassag; Csak a SetKoordinatak és a Rajzol függvényt kellene átírni egy kicsit, hogy jól számoljanak, de a függvény típus paraméterezése maradna olyan, mint amilyen eddig volt. A konstruktor olyan különleges tagfüggvény, amely a példány létrehozásakor automatikusan meghívódik. Általában az adattagok inicializálására, és az osztály használatára való felkészítéséhez szükséges feladatok elvégzésére használjuk. A konstruktor akárhány paramétert kaphat, az alapértelmezett konstruktornak nincsenek paraméterei. Ha nem készítünk konstruktorokat egy osztályhoz, akkor a fordító generál egyet alapértelmezettként, de ez nem inicializálja az adattagokat. Általában mindig saját konstruktort írunk. A túlterhelt konstruktorok. Használatuk igen gyakori. Használatuk oka pedig az, hogy több módszert nyújtanak az új példány inicializálására. Fontos, hogy mindig legyen egy üres, alapértelmezett konstruktor. A konstruktornak nem lehet visszatérési értéke. 2

class CTeglalap int Jobb; int Also; //konstruktor és túlterhelés CTeglalap() CTeglalap(int a, int b, int c, int d) SetKoordinatak( a, b, c, d); //desktruktor ~CTeglalap() void SetKoordinatak(int a, int b, int c, int d) Bal = a; Felso = b; Jobb = c; Also = d; ; Látjuk, hogy a konstruktor public-nak vettük fel, hogy példányosítható legyen. CTeglalap Tegla; Tegla.SetKoordinatak(25,25,100,100); Tegla.Rajzol(); vagy, ha mi allokálunk memóriát CTeglalap *Tegla = new CTeglalap; Tegla->SetKoordinatak(25,25,100,100); Tegla->Rajzol(); Túlterhelt létrehozás. CTeglalap Tegla(25,25,100,100); vagy CTeglalap *Tegla = new Cteglalap(25,25,100,100); Láthattuk, hogy nem a malloc függvényt hívjuk meg C++-ban a példány dinamikus létrehozására, hanem mindig a new operátort, mert az meghívja a létrehozott példány konstruktorát. A destruktor olyan különleges tagfüggvény, amely az osztály példány megsemmisülésekor kerül meghívásra. Felhasználható memória felszabadításra vagy egyéb a megsemmisüléshez szükséges feladatokra is. Destruktort nem lehet túlterhelni. A destruktor neve megegyezik az osztály nevével, de van előtte egy ~ jel. A destruktornak nem lehet visszatérési értéke és nem lehetnek paraméterei sem. A destruktor bármilyen szükséges tevékenységet elvégezhet a memóriaterületek felszabadítására mielőtt az objektum megsemmisül. Tagfüggvényeket létrehozhatunk az osztályon belül vagy osztályon belül csak deklaráljuk és kívül írjuk meg(valami.cpp,valami.h). Az osztályon belül definiált tagfüggvények automatikusan inline tagfüggvényeknek számítanak. A kívül megírt függvények csak akkor lesznek inline függvények, ha azokat az inline kulcsszóval deklaráljuk. Tagfüggvényeken belül a this C++ kulcsszó tartalmazza a függvényhívásnál hivatkozott objektum címét vagyis azt az objektumot, aminek a tagfüggvényét meghívtuk. Ha egy adattagot static kulcsszóval deklarálunk, akkor annak csak egyetlen példánya lesz, az osztályból létrehozott objektumok számától függetlenül A statikus adattagokat az osztály nevével és a hatókör feloldó operátorral érhetjük el, meghatározott példányhivatkozás nélkül. A static kulcsszóval deklarált tagfüggvényeket az osztály nevével és a hatókör feloldó operátorral hívhatjuk, objektumhivatkozás nélkül. Az ilyen függvények közvetlenül csak a saját osztályába tartozó statikus adattagokat és tagfüggvényeket érhetnek el. Általában egy osztály minden példányának megvan a saját másolata az osztályhoz tartozó adattagokból. Amennyiben egy adattagot static kulcsszóval deklarálunk, akkor ebből az adattagból csak egyetlen példány fog létrejönni a memóriában, függetlenül a létrehozott osztály példányainak a számától. Alapszabály és a példában is megfigyelhető, hogy egy osztály statikusnak felvett tagjait az osztályon kívül is deklarálnunk és inicializálnunk kell, ugyanúgy, ahogy azt egy általános globális adattaggal tennénk. Mivel a statikus adattagok definíciója az osztályon kívül kap helyet, egyúttal az osztály nevét is meg kell adni a hatókör-feloldó operátorral(ctest::). Mivel a statikus adattag az osztályon kívül létezik, ezért elérhetjük a példányoktól függetlenül, pusztán az osztály neve és a hatókör-feloldó operátor segítségével. Ahogy a példa is jól mutatja, deklarálhatunk statikus függvényt is. A statikus függvények tulajdonságai a következők: Az osztályon kívüli kód úgy hívhatja meg a függvényt, hogy az osztály nevét használja a hatókör-feloldó operátorral, anélkül, hogy egy példányra hivatkozna. Még nem is kell léteznie a példánynak. 3

A statikus tagfüggvények közvetlenül csak az osztály statikus adattagjaira és statikus függvényeire hivatkozhatnak. Mivel konkrét példányhivatkozás nélkül is hívhatóak, ezért a statikus tagfüggvényeknél nincs this mutató, ami az objektum(példány) címét tartalmazná. A nem statikus adattagok pedig csak a példány létrehozásakor jönnek létre. A statikus adattagokat és tagfüggvényeket az adott osztályra általánosan érvényes adatok kezelésére szoktuk használni. #include <iostream> #include <string> using namespace std; class CTest static int icount; CTest() ++icount; ~CTest() --icount; static int GetCount() return icount; ; int CTest::iCount = 0; void main() cout << CTest::GetCount() << " objektum letezik\n"; CTest Test1; CTest *ptest2 = new CTest; cout << CTest::GetCount() << " objektum letezik\n"; delete ptest2; cout << CTest::GetCount() << " objektum letezik\n"; getchar(); A program futásának az eredménye: 0 objektum letezik 2 objektum letezik 1 objektum letezik Az öröklés fogalma: olyan alapvető programozási technika, amely lehetővé teszi, hogy a már meglévő osztályainkból újakat tudunk származtatni, valamint az egymással kapcsolatban álló osztályokat hierarchiába tudjuk rendezni. Egy meglévő osztályból újat származtathatunk azáltal, hogy a meglévő osztály nevét feltüntetjük az új osztály deklarációjában. A már meglévő osztályt ősosztálynak, az új osztályt származtatott osztálynak nevezzük. A származtatott osztály örökli az ősosztály minden tagját, a származtatott osztályt új tagokkal láthatjuk el (változók, függvények). A származtatott osztály konstruktora explicit módon inicializálhatja az ősosztályát azáltal, hogy paramétereket ad át az ősosztály konstruktorának. Ha a származtatott osztály konstruktora expliciten nem inicializálja az ősosztály konstruktorát, akkor a fordító automatikusan az ősosztály konstruktorát hívja meg. 4

#include <iostream> #include <string> using namespace std; //Õsosztály class CEmberek int igondolat; CEmberek() CEmberek(int iparam) igondolat = iparam; ~CEmberek() void Gondolkodik() igondolat = 1; ; //Származtatott osztály class CProgramozo : public CEmberek CProgramozo() CProgramozo(int iparam) : CEmberek(iparam) ~CProgramozo() ; void main() CProgramozo Geza(25); cout << "Geza " << Geza.GetSorokSzama() << " sort iszik\n"; Geza.SokSortIszik(); cout << "Geza " << Geza.GetSorokSzama() << " sort iszik"; getchar(); Látható, hogy a két osztály nagyon hasonló, a programozó is az emberek halmazába tartozik. Tehát a programozó rendelkezik az emberekre jellemző tulajdonságokkal, ezen felül iszik sört. A : public CEmberek kifejezés hatására a CProgramozo a CEmberek osztályból származó osztály lesz. Ezért örökli a CEmberek osztály adattagjait és tagfüggvényeit. Ha a CProgramozo osztályt teljesen üresen deklaráltuk volna, akkor is rendelkezne az ősosztálya adattagjaival és metódusaival(tagfüggvényeivel). A class CProgramozo : public CEmberek public kulcsszavának hatására az ősosztály minden nyilvános tagja nyilvános marad a származtatott osztályban is. Nagyon ritka az az eset, amikor nem így származtatunk, csak speciális esetekben fordul elő. A CProgramozo osztály taggfüggvénye már a CProgramozo osztály egyedi jellemző függvénye. A konstruktorok és destruktorok meghívásának a sorrendje: Egy származtatott osztály példányosításakor a fordító a következő sorrendben hívja meg a konstruktorokat: 1. Ősosztály konstruktora. 2. Származtatott osztály tagobjektumainak (azon adattagjainak, amelyek objektumok(példányosított osztályok)) konstruktorai. Ezeket a konstruktorokat olyan sorrendben hívja meg, amilyen sorrendben azok az adott osztályban definiálva lettek. 3. Az osztály saját konstruktora. A destruktorok amennyiben definiálva vannak pontosan az ellenkező sorrendben futnak le. 5

Így, amikor egy adott konstruktor hajtódik végre, tudni lehet, hogy az ősosztály és a tagobjektumok már inicializálásra kerültek, és így biztonságosan használhatóak. Hasonlóan, amikor egy adott destruktor fut le, tudjuk, hogy sem az ősosztály sem bármelyik tagobjektum nem lett még megsemmisítve, és így azok még mindig használhatóak. Ha az ősosztály egy adattagja védett, azaz deklarációjában szerepel a protected hozzáférés-módosító, akkor a tag elérhető az osztályból származtatott osztályban, de a program más függvényei által nem. Az int igondolat változót nem tudjuk elérni az származtatott osztályból, vannak esetek, amikor erre szükség van. Ezt a következőképpen tehetjük meg. class CEmberek protected: int igondolat; CEmberek() CEmberek(int iparam) igondolat = iparam; ~CEmberek() void Gondolkodik() igondolat = 1; ; Mivel az igondolat változó protected lett, így már a CProgramozo származtatott osztályból is elérhető lesz. Egy származtatott osztály szolgálhat egy másik osztály őseként. Ilyen módon az egymással kapcsolatban álló osztályok többszintű hierarchiája valósítható meg. Az öröklődés segítségével lehetőség nyílik egy osztály korábban megírt adatstruktúráinak és kódjának újrafelhasználására. Ezáltal könnyebben kezelhető a program és lehetőség van a program által kezelt objektumok kapcsolatrendszerének modellezésére. #include <iostream> #include <string> using namespace std; //Õsosztály, a CApolo közvetett(indirekt) őse class CEmberek protected: int igondolat; CEmberek() CEmberek(int iparam) igondolat = iparam; ~CEmberek() void Gondolkodik() igondolat = 1; ; //Származtatott osztály, CApolo közvetlen(direkt) őse class CProgramozo : public CEmberek CProgramozo() CProgramozo(int iparam) : CEmberek(iparam) 6

~CProgramozo() ; //Származtatott osztály class CApolo : public CProgramozo CApolo() CApolo(int iparam) : CProgramozo(iparam) ~CApolo() ; void main() CProgramozo Geza(25); cout << "Geza " << Geza.GetSorokSzama() << " sort iszik\n"; Geza.SokSortIszik(); cout << "Geza " << Geza.GetSorokSzama() << " sort iszik"; getchar(); Az int igondolat bármelyik CEmberek-ből származtatott osztályból elérhető, de nem érhető el közvetlenül az osztályhierarchián kívüli kódrészben. A származtatott osztályok hierarchiájában minden osztály adott tagfüggvényének saját változatával rendelkezhet. Ha ez a függvény virtuális is egyben, akkor ennek meghívásakor mindig az aktuális objektum típusának megfelelő változat fog lefutni, még akkor, ha a hívás egy ősosztályra mutató mutatón keresztül történik. A virtuális függvények a polimorfizmus is támogatják, azaz egyetlen utasítás segítségével több, különféle művelet futhat le, és hogy éppen melyik, az a szóban forgó objektum típusától függ. A virtuális függvények segítségével egyszerű, általános célú rutinok írhatóak, amelyek különböző, de egymással kapcsolatban álló objektumok széles választékát tudják kezelni. A virtuális függvények segítségével továbbá lehetőség van az ősosztály viselkedésének módosítására anélkül, hogy a forráskódon módosítanánk. Amikor a származtatunk, akkor a kód megkettőzése és a lehetséges egyéb redundanciák elkerülése cél. #include <iostream> #include <string> using namespace std; //Õsosztály class CEmberek protected: int igondolat; CEmberek() 7

CEmberek(int iparam) igondolat = iparam; ~CEmberek() virtual void Gondolkodik() igondolat = 1; ; //Származtatott osztály class CProgramozo : public CEmberek CProgramozo() CProgramozo(int iparam) : CEmberek(iparam) ~CProgramozo() virtual void Gondolkodik() igondolat = 10; isorokszama += igondolat; ; //Származtatott osztály class CApolo : public CProgramozo CApolo() CApolo(int iparam) : CProgramozo(iparam) ~CApolo() virtual void Gondolkodik() igondolat = 100; isorokszama += igondolat; ; 8

void main() CProgramozo Geza(25); CApolo Anett(25); cout << "Geza " << Geza.GetSorokSzama() << " sort iszik\n"; Geza.SokSortIszik(); cout << "Geza " << Geza.GetSorokSzama() << " sort iszik\n"; Geza.Gondolkodik(); cout << "Geza " << Geza.GetSorokSzama() << " -ra gondolt.\n"; Anett.Gondolkodik(); cout << "Geza " << Anett.GetSorokSzama() << " -re gondolt.\n"; getchar(); A program futásának az eredménye: Geza 25 sort iszik. Geza 26 sort iszik. Geza 36 -ra gondolt. Anett 125 -re gondolt. A virtuális függvények az objektum orientált programozás egy fontos vonását támogatják, a polimorfizmust(többalakúság). Akkor beszélünk többalakúságról, ha egyetlen utasítással többfajta különböző művelet hajtható végre, és az, hogy éppen melyik, attól függ, hogy éppen melyik objektumról van szó. Fenti példa jól mutatja ki hogyan gondolkodik és a gondolkodás milyen hatással van a megivott sörök számára. Az öröklés előnyei: Az öröklés segítségével újra felhasználhatóvá válnak a már megírt kódok és a már megtervezett adatstruktúrák. Ezáltal elkerülhető az adat és kód megkettőződése. A programokat könnyebben lehet karbantartani, mivel egy adott feladatot megvalósító kód és adatok általában a programban egyetlen, könnyen elérhető osztály definíciójában szerepelnek ahelyett, hogy szétszórva helyezkednének el a forráskódban. Számos, valós világból származó kapcsolatot lehet hatékonyan modellezni a C++ - ban definiált osztályhierarchiával. Például az emberek osztályából származtatott programozónak is szüksége lehet ápolóra, aki szintén programozó, hogy hatékony és gyors segítséget tudjon nyújtani a programozónak. 9