6. előadás

Tipp: a diák között lépkedni a J és K billentyúkkel lehet. Szöveges kereséshez ctrl-F használható.

Letöltés

1.

Programozás alapjai II. (6. ea) C++ Mutatókonverziók, heterogén kollekció Szeberényi Imre, Somogyi Péter BME IIT <szebi@iit.bme.hu> M Ű E GY E T E M 1 7 82 C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 1-

2.

Öröklés (ismétlés) • Egy osztályból olyan újabb osztályokat származtatunk, amelyek rendelkeznek az eredeti osztályban már definiált tulajdonságokkal és viselkedéssel. • Analitikus – Korlátozó • A tagfüggvények felüldefiniálhatók (override) • virtuális függvény: hogy a tagfüggvény alaposztály felől (pointerén, referenciáján keresztül) is elérhető legyen. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 2-

3.

Analitikus öröklés példa (ism.) class Pont { Pont int x, y; int x, y public: set() Pont(int x1, int y1) :x(x1), y(y1) {} void set(int x1, int y1) {x = x1; y = y1;} Pont3D }; int z class Pont3D :public Pont { set() int z; Bővült public: Pont3D(int x1, int y1, int z1) :Pont(x1, y1), z(z1) {} void set(int x1, int y1, int z1) { Pont::set(x1, y2); z = z1; } }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 3-

4.

Korlátozó öröklés példa/1 (ism.) Szeretnénk egy stack és egy queue osztályt: • mindkettő tároló • nagyon hasonlítanak, de • eltér az interfészük: o put, get o push, pop • önállóan vagy örökléssel ? C++ programozási nyelv © BME-IIT Sz.I. class Queue { .... public: void put( int e ); int get( ); }; class Stack { .... public: void push( int e ); int pop( ); }; 2021.03.22. - 4-

5.

Korlátozó öröklés példa/2 (ism.) class Stack : private Queue { // privát: eltakar a külvilág felé size_t nelem; Továbbhívjuk a get()-et public: Stack( ) : nelem(0) { } int pop( ) { nelem--; return(get()); } Queue void push(int e) { put(e); // betesz put( ),get( ) for( size_t i = 0; i < nelem; i++ ) put(get( )); // átforgat nelem++; Stack } Nem hatékony, csak példa! }; push( ), pop( ) Stack s1; s1.pop(); s1.get() C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 5-

6.

Virtuális tagfüggvény (ism.) Alakzat rajzol() "átdefiniálása" virtuális függvénnyel poz, szin mozgat() virtual rajzol() set() Szakasz késői kötés Kör végpont sugár rajzol() set() rajzol() set() C++ programozási nyelv © BME-IIT Sz.I. set() átdefiniálása: fv. override Alakzat::rajzol(); Mit hív ? 2021.03.22. - 6-

7.

Fontos C++ sajátságok • Konstruktor nem lehet virtuális • Destruktor igen, és érdemes odafigyelni: – Ha alaposztályból dinamikus adattagot tartalmazó osztályt hozunk létre, majd ezt az alaposztály „felől” használjuk (töröljük). • A konstruktorból hívott (saját) virtuális függvény még nincs átdefiniálva! A virt. táblát maga konstruktor tölti ki! (kötés) – absztrakt osztály estén NULL pointer! C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 7-

8.

Inicializálás /1 (ism.) class Pont { protected: Kell a default, mert .... int x, y; public: Pont(int x1 = 0, int y1 = 0) { x = x1; y = y1;} }; class Pont3D :public Pont { int z; Mindig lehet így? public: Pont3D(int x1, int y1, int z1) {x = x1; y = y1; z = z1;} }; Alaposztály konstruktora mikor hívódik? C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 8-

9.

Inicializálás /2 (ism.) class Pont { protected: Most nem kell paraméter nélküli, int x, y; mert paraméterest hívunk. public: Pont(int x1, int y1) : x(x1), y(y1) { } }; class Pont3D :public Pont { Alaposztály konstruktora int z; public: Pont3D(int x1, int y1, int z1) : Pont(x1, y1), z(z1) {} }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 9-

10.

Inicializálás /3 (ism.) class FixKor :public Pont { double& r; Kötelező inicializálni! const double PI; int x, y; public: Kor(int x, int y, double& r) :x(x), y(y), r(r), PI(3.14) { } }; Melyik y? Van már this? class FixKor :public Pont { double& r; static const double PI; ... }; const double Kor::PI = 3.14; C++ programozási nyelv © BME-IIT Sz.I. // statikus tag, létre kell hozni 2021.03.22. - 10 -

11.

Explicit konstruktor • Az egyparaméteres konstruktorok egyben automatikus konverziót is jelentenek: pl: String a = "hello"; String a = String("hello"); • Ez kényelmes, de zavaró is lehet: – tfh: van String(int) – konstruktor, ami megadja a string hosszát, de nincs String(char) konstruktor; – ekkor: String b = 'x'; String b =String(int('x')); nem biztos, hogy kívánatos. • Az aut. konverzió az explicit kulcsszóval kapcsolható ki. (pl: explicit String(int i);) C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 11 -

12.

Explicit konstruktor példa class String { char *p; size_t len; public: String(const char *s = ""); explict String(int); virtual ~String( ); ... }; C++ programozási nyelv © BME-IIT Sz.I. Nincs automatikus konverzió 2021.03.01. - 12 -

13.

Öröklés és polimorfizmus struct A { void valami() { cout << "A valami" << endl; } void semmi() { cout << "A semmi" << endl; } }; struct B: public A{ void valami() { cout << "B valami" << endl; } void valami(int) { cout << "B valami int" << endl; } }; ... B b; b.valami(); // B valami b.valami(1); // B valami(int) b.semmi(); // A semmi b.A::valami(); // A valami b.A::valami(int) // HIBA C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 13 -

14.

Értékadás és kompatibilitás struct Alap { int a; void f(); }; struct Utod : Alap { double d; int f1(); }; Alap alap; alap Utod utod; alap = utod; ? alap új rész A kompatibilitás miatt az értékadás formálisan rendben, de az új résznek nincs helye a memóriában. Elveszik. Szeletelődés (slicing) történik. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 14 -

15.

Mutatókonverzió és kompatibilitás struct Alap { int a; void f(); }; struct Utod : Alap { double d; int f1(); }; Alap alap; Utod utod; alap alap √ új rész Alap* p = &utod; Memóriakép rendben van, de mi a helyzet a viselkedéssel? C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 15 -

16.

Konverzió alaposztály mutatóra struct Alap { void f(); }; struct Pub : public Alap { void f(); }; struct Priv : private Alap { void f(); }; Alap *p1B, *p2B; p1B pub priv p2B Pub pub; // pub kaphat Alap-nak szóló üzeneteket. p1B = &pub; // nem kell explicit típuskonverzió p1B->f() // alap o. f() elérhető alap új rész Priv priv; // priv nem érti Alap üzeneteit pl: priv.Alap::f() p2B = (Alap*)&priv;// explicit konverzió kell p2B->f() // így már érti Viselkedés és a memóriakép is kompatibilis. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 16 -

17.

Konverzió származtatott o. mutatóra struct Alap { void f(); }; struct Pub : public Alap { void f(); }; struct Priv : private Alap { int a; }; Alap alap; Pub* p1D; Priv* p2D; p1D = (Pub*)&alap; p1D->f(); // ????? p2D = (Priv*)&alap p2D->a = 0 // ????? p1D p2D alap alap Explicit konverzióval nem létező adatmezőket és függvényeket is el lehet érni! Ne használjuk! Veszélyes! Viselkedés és a memóriakép SEM kompatibilis. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 17 -

18.

Típuskonverzió és az öröklés • Kompatibilitás esetén a konverzió automatikus. • A másik irányba (alapból származtatottra) explicit módon ki lehet kényszeríteni, de a legtöbb esetben értelmetlen és veszélyes! • Típuskonverzió = objektumkonverzió • Mutatókonverzió = rejtett objektumkonverzió • Kompatibilitás: – kompatibilis memóriakép – kompatibilis viselkedés (tagfüggvények) C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 18 -

19.

Függv. elérése alap. o. mutatóval class Alakzat { ... virtual void rajz() = 0; void k(); }; class Szakasz : public Alakzat { void rajz(); void k(); }; class Kor : public Alakzat { void rajz(); void k();... }; Alakzat* tar[100]; tar[0] = new Szakasz(....); // konverzió, (kompatibilis) tar[1] = new Kor(...); // konverzió, (kompatibilis) .... for (int i = 0; i < 100; i++ ) { tar[i] ->rajz(); tar[i]->k(); } Származtatott o. fv. C++ programozási nyelv © BME-IIT Sz.I. Alap oszt. függvénye 2021.03.22. - 19 -

20.

Heterogén gyűjtemények • Különböző típusú objektumokat egy közös gyűjteménybe tesszük • Egységes kezelés: valamilyen viselkedési kompatibilitásra építve – egy öröklési hierarchiából származó objektumokat tehetünk heterogén szerkezetbe – kompatibilitásból származó előnyök kihasználása C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 20 -

21.

Heterogén kollekció példa • Egy rendszer eseményeit kell naplózni. • Az események egymástól eltérő adattartamúak, és esetleg új események is lesznek, amit még nem ismerünk. • Események sorrendje fontos, ezért célszerűen egy tárolóban kell lenniük. • Az eseménynapló megnézésekor meg kell mutatni azt is, hogy mely eseményeket néztük meg már korábban. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 21 -

22.

Eseménynaplózó osztályai Event checked show( ) Event1 ..... show( ) * EventList add( ), list( ) Event2 ..... show( ) ... Még nem ismerjük, de nem is kell! C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 22 -

23.

Esemény és leszármazottai class Event { bool checked; public: Event ( ) :checked(false) {} virtual void show( ) { cout<<" Checked: "; cout<<checked<<endl; checked = true; } virtual ~Event() {} }; class Event1 :public Event { ... public: Event1(); void show ( ) { cout << ................ ; Event::show(); } }; C++ programozási nyelv © BME-IIT Sz.I. Hurok ? 2021.03.22. - 23 -

24.

Eseménylista: pointerek tárolója class EventList { Alaposztály pointereket size_t nevent; tárolunk Event* events[100]; public: EventList( ) : nevent(0) {} Származtatott osztály függvénye void add(Event* e) { if (nevent < 100) events[nevent++] = e; } void list( ) { for (size_t i = 0; i < nevent; i++) events[i]->show(); } ~EventList() { for (size_t i = 0; i < nevent; i++) delete events[i]; } }; Megszűnik az esemény is (komponens reláció) C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 24 -

25.

Eseménynapló használata class Event {...}; class Event1 :public Event {...}; class Event2 :public Event {...}; class EventList {...}; ... EventList list; list.add(new Event1(....)); ... list.add(new Event2(....)); ... ... list.add(new Event9(....)); Új esemény: csupán definiálni kell az új osztályt Ezzel a list-re bízzuk az objektumot, hiszen a pointerét nem jegyezzük meg. list.list(); C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 25 -

26.

Ki szabadít fel? class EventList { size_t nevent; Event* events[100]; public: EventList( ) : nevent(0) {} void add(Event* e) { if (nevent < 100) events[nevent++] = e; else { delete e; throw „nem fért be”; }} void list( ) { for (size_t i = 0; i < nevent; i++) events[i]->show(); } ~EventList() { for (size_t i = 0; i < nevent; i++) delete events[i]; // ~Event(); } }; .... Virtuális kell! list.add(new Event1(....)); C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 26 -

27.

Virtuális destruktor újból class Event { public: virtual void show( ) {} virtual ~Event() {} 2 }; class Event1 :public Event { int *p; public: Event1(int s) { p = new int[s]; } void show() {} ~Event1() { delete[] p; } }; Event *ep = new Event1(120); ep->show() delete ep; Virt. destr. más, mint a többi virt. fv., mert az ős destruktora mindig meghívódik! https://git.ik.bme.hu/Prog2/eloadas_peldak/ea_06 C++ programozási nyelv © BME-IIT Sz.I. 1 virt_destruktor2 2021.03.22. - 27 -

28.

Összetettebb példa: CppBolt • Pénztárgépet modellezünk: A pénztáros megadja az eladott mennyiséget és az árut. • A gép nyilvántartást vezet. Lekérdezhető a napi/összes eladás, napi bevétel, stb. • Ötlet: heterogén kollekció: – Közös attr.: eladott mennyiség, dátum, (összeg) • Probléma: minden áru ebből származzon? – Nem célszerű • Megoldás (1): közbenső osztály az áruk valós őse (pointere) fölé. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 28 -

29.

CppBolt Csomagoló osztály: Tetel, ami Aru pointereket tárol. Aru az őse a „valós” áruknak. A Kassza pedig a tároló http://svn.iit.bme.hu/proga2/cporta_peldak/CppBolt/ C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 29 -

30.

Heterogén kollekció összefoglalás • Különböző típusú objektumokat egy közös gyűjteménybe tesszük. • Kihasználjuk az öröklésből adódó kompatibilitást. • Nagyon gyakran alkalmazzuk – könnyen bővíthető, módosítható, karbantartható • Rossz alkalmazásánál: slicing!!! C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 30 -

31.

Tipikus halálfejes hiba class EventList { Nem pointert tárol! int nevent; Event events[100]; public: EventList( ) { nevent = 0; } void add(Event& e) { if (nevent < 100) events[nevent++] = e; } void list( ) { for (int i = 0; i < nevent; i++) events[i].show(); } }; Event::show() Adatvesztés! Szeletelés (slicing) A származtatott rész elveszik! C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 31 -

32.

Digitális áramkör modellezése • Digitális jel: üzenet (objektum) • Áramköri elemek: objektumok – bemenet, kimenet, viselkedés (f(x)) – kapcsoló, kapu, drót, forrás, csomópont • Objektumok a valós jelterjedésnek megfelelően egymáshoz kapcsolódnak. (üzennek egymásnak) • Visszacsatolás megengedett. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 32 -

33.

Modell Bemenetek f(x) Kimenetek Visszacsatolás A változásokat üzenetek továbbítják. Ha nincs változás, nem küldünk újabb üzenetet. Csak véges számú iterációt engedünk meg. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 33 -

34.

Áramköri elemek felelőssége • Kapcsolatok (bemenet/kimenet) kialakítása, nyilvántartása. • Bejövő üzenetek tárolása összehasonlítás céljából. • Válaszüzenetek előállítása és továbbítása a bejövő üzeneteknek és a működésnek megfelelően. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 34 -

35.

Osztályhierarchia 1+ Obj Drot 2 Message Csp 3 Message C++ programozási nyelv © BME-IIT Sz.I. NAND 3 Message Conn 2 R_S_FF Forras 4 1 Message Message 2021.03.22. - 35 -

36.

Obj: alaposztály • Minden áramköri elem ebből származik • Felelőssége: – az objektumok közötti kapcsolatok leírása (a Conn osztály dinamikus tömbje) – kapcsolatokon keresztül az üzenetek (Message objektum) továbbítása, – a működést (viselkedést) megvalósító függvény elérése (a set virtuális függvényen keresztül). C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 36 -

37.

Obj: absztrakt alaposztály class Obj { String nev; // objektum neve Pin nk; // kapcsolódási pontok száma Conn *konn; // kapcsolatok leírása Obj(const Obj&) ; // hogy ne lehessen használni Obj& operator=(const Obj&); // hogy ne lehessen haszn. public: Obj(const char *n, Pin k) : nev(n) { konn = new Conn[nk = k]; } virtual ~Obj() { delete[] konn; } // tömb felszab. void setNev(const char *n) { nev =String(n); }// név beáll. void setConn(Pin k, Obj& o, Pin on); // összekapcs. void uzen(Pin k, Message msg); // üzen virtual void set(Pin n, Message msg) = 0; //működtet }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 37 -

38.

Conn: kapcsolatok tárolása • Egy objektumkapcsolatot leíró osztály • Példányaiból felépített dinamikus tömb (Obj::konn) írja le egy objektum összes kapcsolatát Miért nem referencia ? class Conn { Obj *obj; // ezen objektumhoz kapcsolódik Pin n; // erre a pontra public: Conn() :obj(NULL) {} void setConn(Pin k, Obj& o) { n = k; obj = &o; } // beállít Obj *getConn(Pin& k) { k = n; return(obj); } // lekérdez }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 38 -

39.

Message: jel mint üzenet • Digitális jelet reprezentáló osztály – undef, jel 0 és jel 1 értéke van. • A végtelen iteráció elkerülése végett a jelszint mellet egy iterációs számláló is van. • Megvalósítása struktúrával, mivel az adattakarás csak nehezítene. • Műveletei: msg1 == msg2 msg1 + msg2 C++ programozási nyelv © BME-IIT Sz.I. msg1 != msg2 --msg 2021.03.22. - 39 -

40.

Message: jel mint üzenet /2 struct Message { enum msgt { undef, jel} typ; // típus bool J; // jelszint 0 v. 1 int c; // iterációs számláló Message(msgt t = undef, bool j = false, int n = 20) :typ(t), J(j), c(n) {} // két üzenet egyenlő, ha az típusuk és jelszintjük is azonos bool operator==(const Message& m) const { return(typ == m.typ && J == m.J); } bool operator!=(const Message& m) const { return(!operator==(m)); } Message operator+(const Message &m) const { return Message(std::max(typ, m.typ, J+m.J, std::max(c,m.c)); } Message& operator--() { pre-dekremens op. if (--c <= 0) throw "Sok Iteracio!"; return(*this); } }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 40 -

41.

Üzenet továbbítása /** * Üzenet (msg) küldése a k. pontra kapcsolódó obj. felé */ void Obj::uzen(Pin k, Message msg) { Pin n; // kapcsolodó objektum kapcs. pontja if (k >= nk) throw "Uzenet hiba"; // hiba, nincs ilyen végpont if (Obj *o = konn[k].GetConn(n)) { o->set(n, --msg); // szomszéd működtető függvénye } } C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 41 -

42.

Drót obj. modellje Obj nev, pin, konn setNev(), setConn(), uzen(), set() Drot veg[2] set() get() C++ programozási nyelv © BME-IIT Sz.I. 2 Conn obj, n setConn(), getConn() 2 Message J, c ==(), !=() --(), +() 2021.03.22. - 42 -

43.

Drót kicsit precízebben A diagram szerkesztéséhez az UMLet ( http://www.umlet.com/ ) programot használtam. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 43 -

44.

Drót class Drot :public Obj { protected: // megengedjük a származtatottnak Message veg[2]; // két vége van, itt tároljuk az üzeneteket public: Drot(const char *n = "") : Obj(n, 2) {} // 2 végű obj. Létrehozása Message get() const { return veg[0] + veg[1]; }//bármelyik vég void set(Pin n, Message msg); // működtet }; void Drot::set(Pin n, Message msg) { if (veg[n] != msg) { // ha változott veg[n] = msg; // megjegyezzük és uzen(n^1, msg); // elküldjük a másik végére (vezet) } } Gonosz trükk! C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 44 -

45.

Csomópont class Csp :public Obj { protected: // megengedjük a származtatottnak Message veg[3]; // három vége van, itt tároljuk az üzeneteket public: Csp(const char *n = "") : Obj(n, 3) {} // 3 végű objektum void set(Pin n, Message msg); // működtet }; void Csp::set(Pin n, Message msg) { if (veg[n] != msg) { // ha változott veg[n] = msg; // megjegyezzük és uzen((n+1)%3, msg); // elküldjük a másik 2 végére uzen((n+2)%3, msg); } } C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 45 -

46.

Kapcsoló class Kapcsolo :public Drot { // Drótból bool be; // állapot public: Kapcsolo(const char *n = "") : Drot(n), be(false) {} void set(Pin n, Message msg); jel, false, lehetne undef void kikap() { be = false; uzen(0, Message(Message::jel)); uzen(1, Message(Message::jel)); } void bekap() { be = true; uzen(0, veg[1]); uzen(1, veg[0]);} }; void Kapcsolo::set(Pin n, Message msg) { if (be) Drot::set(n, msg); // be van kapcsolva, drótként viselk. else veg[n] = msg; // ki van kapcsolva, csak megjegyezzük } C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 46 -

47.

0 1 2 NAND kapu class NAND :public Obj { Message veg[3]; // három "vége" van public: NAND(const char *n = "") : Obj(n, 3) {} // 3 végű obj. létreh. void set(Pin n, Message msg); // működtet Message get() { return(veg[2]); } // kim. lekérdezése }; void NAND::set(Pin n, Message msg) { if (n != 2 && veg[n] != msg) { // ha változott bemenet veg[n] = msg; // megjegyezzük uzen(2, veg[2] = Message(Message::jel, !(veg[0].J * veg[1].J), msg.c)); // üzenünk a kimeneten } } kimenet előállítása ciklusszám marad C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 47 -

48.

S_ (0) R_ (1) 1 2 N0 0 0 N1 2 1 Q (2) Q_ (3) R_S_ tároló Class R_S_FF :public Obj { protected: Message veg[4]; // négy "vége" van NAND N[2]; // két db NAND kapu, komponens public: R_S_FF(const char *n) : Obj(n, 4) { N[0].setConn(2, N[1], 0); // összekötések létrehozása N[1].setConn(2, N[0], 0); } void set(Pin n, Message msg); // működtet Message get(int i) { // kimenet lekérdezése if (i >= 2) i = 0; return(veg[i+2]);} }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 48 -

49.

R_S_ tároló /2 S_ (0) 1 0 N0 2 0 R_ (1) 1 N1 2 Q (2) Q_ (3) Void R_S_FF::set(Pin n, Message msg) { if (n < 2 && veg[n] != msg) { // ha input és változott, veg[n] = msg; // letárolja N[n].set(1, msg); // megfelelő bemenetre küldi uzen(2, veg[2] = N[0].get()); // üzen a kimeneten uzen(3, veg[3] = N[1].get()); // üzen a kimeneten } } Kimenetek előállítása, mert belül nincs csomópont. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 49 -

50.

Szimulátorunk próbája Kapcsolo K1("K1"), K2("K2"); Forras F1("F1"), F2("F2"); R_S_FF FF("FF"); K1 F1 K2 F1.init(); F2.init(); K1.bekap(); K2.bekap(); cerr << FF.get(0).J << FF.get(1).J << FF.get(2).J K1.kikap(); cerr << FF.get(0).J << FF.get(1).J << FF.get(2).J K1.bekap(); cerr << FF.get(0).J << FF.get(1).J << FF.get(2).J K2.kikap(); cerr << FF.get(0).J << FF.get(1).J << FF.get(2).J } catch (const char *s) { cerr << s << endl; } https://git.ik.bme.hu/Prog2/eloadas_peldak/ea_05 C++ programozási nyelv © BME-IIT Sz.I. FF F2 try { F1.setConn(0, K1, 0); FF.setConn(0, K1, 1); F2.setConn(0, K2, 0); FF.setConn(1, K2, 1); 1101 0110 1110 1001 << FF.get(3).J << endl; << FF.get(3).J << endl; << FF.get(3).J << endl; << FF.get(3).J << endl; digit 2021.03.22. - 50 -

51.

Összefoglalás Öröklés – – – – – – – újrafelhasználhatóság kompatibilitás heterogén kollekció pointer konverzió adatvesztés virtuális tagfüggvények absztrakt alaposztály C++ programozási nyelv © BME-IIT Sz.I. 2021.03.22. - 51 -

Utolsó frissítés: 2021-04-16 16.30