Presentation laddar. Vänta.

Presentation laddar. Vänta.

Sid 1 2000-period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering + arv Fordon TågBåtBil Flygplan.

Liknande presentationer


En presentation över ämnet: "Sid 1 2000-period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering + arv Fordon TågBåtBil Flygplan."— Presentationens avskrift:

1 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering + arv Fordon TågBåtBil Flygplan

2 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Exempel på arv Drawable rita() flytta() position bitmap Persistent save() restore() storage_file_name object_id Box bredd hojd Text_Box text font Cirkel centrum radie Linje end_a end_b Pil riktning byt_ riktning() Bankkonto agare saldo satt_in(summa) ta_ut(summa) Bilregpost agare marke regnr besiktigad() skattad()

3 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Arv innebär “Underklassen” kan göra det som “överklassen” gör + det vi själva bestämmer att den ska kunna dessutom Underklassen håller samma data som överklassen + det den behöver för sitt eget tillagda beteende Olika underklasser kan göra samma sak på olika sätt

4 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Arv innebär forts Underklassens beteende är mer specialiserat Överklassens beteende är mer generellt Klasser som är mycket generaliserade har vi ingen nytta av att instansiera - abstrakta överklasser

5 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Att jobba med arv Oftast börjar man med att hitta de objekt man behöver - och deras klasser Sen letar man rätt på beteende som är gemensamt för flera klasser –bryts ut till överklass Man tittar också efter existerande klasser man kan använda

6 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Överklassens privata data kan inte underklassens metoder komma åt Metoder som är implementerade i överklassen kommer dock åt dem

7 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Synligt (public) arv - arv av interface class Box : public Drawable {/* metoder och data */} Box-klassens anropssnitt erbjuder även metoderna rita() och flytta() som definierats i överklassen Drawable (jfr sid 1. rita() och flytta() är givetvis public:) Även implementationen ärvs - om inte...

8 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Synligt (public) arv - arv av interface forts class Bankkonto : public Persistent {/* metoder och data */} Bankkonto -klassens anropssnitt erbjuder även metoderna save() och restore() som definierats i överklassen Persistent (jfr sid 1. save() och restore() är givetvis public:) Även implementationen ärvs - om inte...

9 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Om inte... Överklassen Drawable vet inte hur en Box eller Cirkel ser ut, bara att det ska gå att rita den - alltså får draw() implementeras i Box, Cirkel, Linje,... Drawable::rita() är en pure virtual function Enbart anropssnitt (interface) ärvs för metoden draw() Drawable kan inte instansieras - - Drawable är en abstrakt överklass

10 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Ett statiskt allokerat objekt Har plats för de medlemsdata som finns i dess typ - varken mer eller mindre Alltså är överklass-objektets lagringsutrymme mindre än underklassobjektet Slicing – konstruktionsfel på språket C++? Pekare eller referenser måste användas i C++ OOP! !

11 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Exempel: Drawables Gör en sekvens av grafikobjekt av olika subtyp - Box, Cirkel, Linje, etc. som ska ritas på skärmen Vi kan inte allokera statiskt, objekten måste hanteras via pekare eller referenser (varför var det så?) adasd dfasfas sfdsfd Box*Cirkel* Pil* Linje* Text_Box*

12 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Exempel: Drawables forts List ritlista; // template // class List //... List::stoppaIn(Type *elem); ritlista.stoppaIn(minOrangeBox); ritlista.stoppaIn(mingroenaCirkel); ritlista.stoppaIn(mittStreck); Jag trodde att typkontrollen skulle sätta stopp för det där!

13 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Konvertering subtyp supertyp Konvertering från subtyp till supertyp är tillåtet - sker automatiskt (implicit) vid behov! Nödvändigt för att OOP ska fungera. (Glöm inte: pekare/referenser, annars slicing)

14 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Public inheritance - synligt arv public members (synliga medlemmar) i överklassen blir public (synliga) i underklassen Protected members (skyddade medlemmar) i överklassen blir protected (skyddade) i underklassen –(privata medlemmar i överklassen kommer man inte åt alls från underklassen)

15 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Protected inheritance - skyddat arv public members (synliga medlemmar) och protected members (skyddade medlemmar) i överklassen blir protected (skyddade) i underklassen –(privata medlemmar i överklassen kommer man inte åt alls från underklassen)

16 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Private inheritance - privat arv public members (synliga medlemmar) och protected members (skyddade medlemmar) i överklassen blir private (privata) i underklassen –(privata medlemmar i överklassen kommer man inte åt alls från underklassen)

17 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT i överklasstyp av arvi underklass publicpublicpublic protected public protected privatepublicej åtkomlig publicprotected protected protectedprotected protected privateprotected ej åtkomlig publicprivate private protectedprivate private privateprivate ej åtkomlig

18 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Hur är arv implementerat? Drawable position bitmap Persistent storage_file_name object_id Box bredd hojd Text_Box text font Cirkel centrum radie Linje end_a end_b Pil riktning Bankkonto agare saldo Bilregpost agare marke regnr

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

20 Sid period2CD5250 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

21 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Åtkomst av överklassmedlemmar protected: int x; MyBaseClass SubClassA SubClassB A myaobj1; x A myaobj2; x B mybobj; x doIt() ?

22 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Virtuell funktion Komma åt subtyp-specifik implementation av virtuella funktionsanrop från bastypen Nödvändigt för att OOP ska fungera. den virtuella hanteringen fungerar bara om objektet hanteras via pekare eller referens –statiskt allokerat objekt ÄR av den statiska typen

23 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Implementation av objekt med statiska och virtuella metoder int x float f _vptr_Myclass type_info för Myclass Virtual table för Myclass static int Myclass::noOfObjs Myclass::print(ostream &) Myclass::draw() Myclass::~Myclass() static int Myclass::getNoOfObjs() int Myclass::get_x() Virtuella metoder nås via vptr

24 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Pure virtual function class Drawable { virtual void draw() = 0;... “= 0” markerar pure virtual function Definierar (en del av) ett snitt utan att implementera det

25 Sid period2CD5250 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

26 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Arv av beteende Ger även arv av implementation –utom då man jobbar med pure virtual function/rent abstrakta överklasser Synligt arv

27 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Arv av implementation 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? Stack teststack; teststack.push(x); teststack.push(y); t=teststack.pop(); Vi får ett väldigt fult anropssnitt! t=teststack[10]; teststack.push_back(e); Privat eller skyddat arv

28 Sid period2CD5250 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; }

29 Sid period2CD5250 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.

30 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT skydda konstruktorn på abstrakt överklass Drawable rita() flytta() position bitmap Box bredd hojd Text_Box text font Cirkel centrum radie Linje end_a end_b Pil riktning byt_ riktning() class Drawable { protected: Drawable(); ….. Varför inte private?

31 Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Virtuell destruktor delete drawable_ptr; Delete genom basklass-pekare tar bara bort basklass- objekt-delen om inte destruktorn är virtual! adasd dfasfas sfdsfd Box*Cirkel* Pil* Linje* Text_Box* Är protected basklass- destruktor en bra ide?


Ladda ner ppt "Sid 1 2000-period2CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering OOP = objektbaserad programmering + arv Fordon TågBåtBil Flygplan."

Liknande presentationer


Google-annonser