240 likes | 453 Views
Fordon. Tåg. Båt. Bil. Flygplan. Objektorienterad programmering forts. Drawable. Persistent. position bitmap. storage_file_name object_id. Box. Cirkel. Linje. bredd hojd. end_a end_b. centrum radie. Bilregpost agare marke regnr. Bankkonto. agare saldo. Text_Box. Pil.
E N D
Fordon Tåg Båt Bil Flygplan Objektorienterad programmering forts CD5250 OOP med C++ Mats Medin MDH/IDT
Drawable Persistent position bitmap storage_file_name object_id Box Cirkel Linje bredd hojd end_a end_b centrum radie Bilregpost agare marke regnr Bankkonto agare saldo Text_Box Pil text font riktning Hur är arv implementerat? CD5250 OOP med C++ Mats Medin MDH/IDT
Implementation av arv Cirkel mincirkel; position bitmap datamedlemmar från basklassen centrum radie underklass-specifika datamedlemmar CD5250 OOP med C++ Mats Medin MDH/IDT
Vad ärvs? • medlemsfunktioner ärvs • medlemsdata ärvs • friends (vänner) ärvs inte • konstruktor ärvs inte • basklassens konstruktor anropas, vanligen från initieringslistan för att sätta rätt värden i basklassdelen • en nivå upp kan man anropa CD5250 OOP med C++ Mats Medin MDH/IDT
MyBaseClass protected: int x; A myaobj1; A myaobj2; B mybobj; SubClassB x x x SubClassA Åtkomst av överklassmedlemmar doIt() ? doIt() CD5250 OOP med C++ Mats Medin MDH/IDT
Virtuell funktion • Komma åt subtyp-specifik implementation av virtuella funktionsanrop från bastypen • den virtuella hanteringen fungerar bara om objektet hanteras via pekare eller referens • statiskt allokerat objekt ÄR av den statiska typen CD5250 OOP med C++ Mats Medin MDH/IDT
Myclass::print(ostream &) Myclass::draw() Myclass::~Myclass() Implementation av objekt med statiska och virtuella metoder type_info för Myclass int x float f _vptr_Myclass Virtual table för Myclass static int Myclass::noOfObjs static int Myclass::getNoOfObjs() int Myclass::get_x() Virtuella metoder nås via vptr CD5250 OOP med C++ Mats Medin MDH/IDT
Pure virtual function Definierar (en del av) ett snitt utan att implementera det class Drawable { virtual void draw() = 0; virtual void draw() = 0; ... “= 0”markerar pure virtual function CD5250 OOP med C++ Mats Medin MDH/IDT
Abstrakt överklass En klass med en eller flera pure virtual functions är en abstrakt överklass. En klass med bara pure virtual functions (dvs ingen funktion är implementerad i den) är en rent abstrakt överklass. Syftet med den är bara att specificera ett snitt som underklasserna ska tillhandahålla CD5250 OOP med C++ Mats Medin MDH/IDT
Arv av beteende Synligt arv • Ger även arv av implementation • utom då man jobbar med pure virtual function/rent abstrakta överklasser CD5250 OOP med C++ Mats Medin MDH/IDT
Arv av implementation Privat eller skyddat arv Stack teststack; teststack.push(x); teststack.push(y); t=teststack.pop(); class Stack : private Vector { public: push(Elem e) {/* peta i vektorn */} Elem pop() { /* peta i vektorn */} } Vad händer om man använder public inheritance istället? Vi får ett väldigt fult anropssnitt! t=teststack[10]; teststack.push_back(e); CD5250 OOP med C++ Mats Medin MDH/IDT
...men en stack är inte en vektor Snyggare, renare, med en vektor som beståndsdel i stället för arv: class Stack { public: push(Elem e) { theStack.pushBack(e); } Elem pop() { /* ... */ } private: Vector theStack; } CD5250 OOP med C++ Mats Medin MDH/IDT
Konstruktor-destruktor och arv När ett objekt skapas sker följande: 1. Konstruktorn för ev. överklass anropas alltid först. 2. Konstruktorerna för den aktuella klassens datamedlemmar anropas 3. Satserna i den aktuella klassens konstruktor exekveras. När ett objekt tas bort sker följande: 1. Satserna i den aktuella klassens destruktor exekveras. 2. Destruktorerna för den aktuella klassens datamedlemmar anropas 3. Destruktorn för ev. överklass anropas. CD5250 OOP med C++ Mats Medin MDH/IDT
Drawable Persistent position bitmap storage_file_name object_id draw() move() save() restore() Box Circle Line length width end_a end_b center radius Persistent_drawable Multipelt arv CD5250 OOP med C++ Mats Medin MDH/IDT
ios format_state condition_state locale streambuf Multipelt arv: iostream (inte riktigt rätt) class ostream : public ios class istream : public ios ostream istream gcount xxx ifstream ofstream iostream yyy class iostream : public istream, public ostream fstream CD5250 OOP med C++ Mats Medin MDH/IDT
format_state condition_state locale streambuf format_state condition_state locale streambuf format_state condition_state locale streambuf format_state condition_state locale streambuf gcount xxx xxx yyy gcount iostream object??? istream object ostream object över- klass- delen från ios över- klass- delen från ios från istream ostreams “egen” underklassbit istreams “egen” underklassbit från ostream Kompileringsfel - dock endast vid försök att accessa de dubblerade delarna! iostreams “egen” underklassbit CD5250 OOP med C++ Mats Medin MDH/IDT
ios format_state condition_state locale streambuf Multipelt arv: iostream med virtual inheritance class ostream : virtual public ios class istream : virtual public ios ostream istream gcount xxx ifstream ofstream iostream yyy class iostream : public istream, public ostream fstream CD5250 OOP med C++ Mats Medin MDH/IDT
format_state condition_state locale streambuf gcount xxx yyy iostreams “egen” underklassbit Virtual inheritance iostream object en enda ios-bit! virtuell basklass från istream från ostream CD5250 OOP med C++ Mats Medin MDH/IDT
multipelt Konstruktor-destruktor och arv När ett objekt skapas sker följande: 1. Konstruktorn för ev. överklass anropas alltid först. 2. Konstruktorerna för den aktuella klassens datamedlemmar anropas 3. Satserna i den aktuella klassens konstruktor exekveras. i deriveringslistans turordning När ett objekt tas bort sker följande: 1. Satserna i den aktuella klassens destruktor exekveras. 2. Destruktorerna för den aktuella klassens datamedlemmar anropas 3. Destruktorn för ev. överklass anropas. baklänges enligt deriveringslistans turordning CD5250 OOP med C++ Mats Medin MDH/IDT
Drawable position bitmap rita() flytta() Box Cirkel Linje bredd hojd end_a end_b centrum radie Text_Box Pil text font riktning byt_ riktning() skydda konstruktorn på abstrakt överklass class Drawable { protected: Drawable(); ….. Varför inte private? CD5250 OOP med C++ Mats Medin MDH/IDT
Linje* Pil* Box* Cirkel* Text_Box* adasd dfasfas sfdsfd Virtuell destruktor delete drawable_ptr; Delete genom basklass-pekare tar bara bort basklass-objekt-delen om inte destruktorn är virtual! Är protected basklass- destruktor en bra ide? CD5250 OOP med C++ Mats Medin MDH/IDT
typeid och type_info #include <typeinfo> type_info ti; class Minklass : public Overklass {…} Minklass mittobj; Overklass *minpekare = & mittobj; ti = typeid(*myptr); cout << ti.name() << endl; // Vad händer? CD5250 OOP med C++ Mats Medin MDH/IDT
typeid och type_info forts cout << ti << endl; // Vad händer? klass med virtuella funktioner: • det av myptr utpekade objektets dynamiska typ skrivs ut, dvs Minklass klass utan virtuella funktioner: • den statiska typen hos uttrycket (*myptr) skrivs ut, dvs Basklass typeid funkar på alla slags typer och uttryck: typeinfo(myint), typeinfo(a || b), typeinfo(3.1415) CD5250 OOP med C++ Mats Medin MDH/IDT