1 / 23

Objektorienterad programmering forts

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.

eytan
Download Presentation

Objektorienterad programmering forts

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Fordon Tåg Båt Bil Flygplan Objektorienterad programmering forts CD5250 OOP med C++ Mats Medin MDH/IDT

  2. 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

  3. Implementation av arv Cirkel mincirkel; position bitmap datamedlemmar från basklassen centrum radie underklass-specifika datamedlemmar CD5250 OOP med C++ Mats Medin MDH/IDT

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. ...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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

More Related