Arv bakgrund (kap. 9)



Relevanta dokument
Problemet. Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism)

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Introduktion till arv

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Kursinformation. Kurslitteratur. Bonuspoäng till tentan. CD5250, Objektorienterad Programmering med C++ Daniel Flemström,

5 Arv och dynamisk bindning FIGUR

Dynamisk bindning och polymorfism

Klasshierarkier - repetition

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Nedan skapar vi klassen Person innehållande datamedlemmar för förnamn, efternamn, ålder, längd och vikt:

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer

TDDC76 Programmering och datastrukturer

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Arv. Objektorienterad och komponentbaserad programmering

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

2I1049 Föreläsning 5. Objektorientering. Objektorientering. Klasserna ordnas i en hierarki som motsvarar deras inbördes ordning

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

allokeras på stacken dynamiskt new delete

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Objektorienterad Programmering (TDDC77)

Klasser. Det är egentligen nu som kursen i programmeringsteknik börjar..., s k objektorienterad programmering.

Konstruktion av klasser med klasser

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Programsystemkonstruktion med C++

TDIU01 Programmering i C++

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Klasshierarkier. Klasser kan byggas på redan definierade klasser

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 13 Innehåll

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

1 Klasser och objektorientering Vad är objektorientering?

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

C++ Objektorientering - Klasser. Eric Elfving

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Övningar Dag 2 En första klass

TDIU20 - Objektorienterad programmering i c++ - föreläsning 6

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

OOP Objekt-orienterad programmering

1 Namnkontroll (NameControl)

OOP Objekt-orienterad programmering

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Classes och Interfaces, Objects och References, Initialization

Java-syntax (arv) Exempel: public class Crow extends Bird {... } Jämför med Lab 1: public class FirstApp extends Frame {... }

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

Polymorfi. Objektorienterad och komponentbaserad programmering

Arv innebär att man skapar en ny klass (subklass) utifrån en redan existerande klass (superklass, basklass).

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

TDDC76 - Programmering och Datastrukturer

Laboration 1: Figurer i hierarki

Skapa, kopiera och destruera klassobjekt

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Tentamen Objektorienterad Programutveckling med C++

Föreläsning 5-6 Innehåll

TUTORIAL: KLASSER & OBJEKT

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad Programmering (TDDC77)

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Målen med OOSU. Objektorienterad programmering. Objektorienterad programmering. Karlstads Universitet, Johan Öfverberg 1

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: Tid: kl

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 3 Erik Nilsson, Institutionen för Datavetenskap, LiU

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.


TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Objektorientering - Arv och polymorfi

Objektorienterade programmeringsspråk. Grundalgoritm Mark and sweep. Garbage Collection (GC) Olika GC-strategier

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

DAT043 - Föreläsning 7

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

För alla uppgifter på tentan gäller: Man får använda både standard-c++ (som till exempel har pekare som anges med * och objekt som skapas med new) och

Transkript:

Föreläsning 4

Arv bakgrund (kap. 9) Hund pälsfärg favoritben smutsa_ned() ät_katt() Kanin pälsfärg slaktvikt smutsa_ned() Katt pälsfärg smutsa_ned() klös_soffa()

Arv bakgrund Många klasser delar på egenskaper och beteende Det framstår onödigt att återskapa samma saker om och om igen C++ erbjuder verktyg för att samla ihop gemensamma egenskaper och beteenden i överklasser

Problemlösningsmetodik Börja med att identifiera alla klasser som behövs Leta sedan efter beteenden som är gemensamma för flera klasser Bryt ut i en överklass Kontrollera även om det redan finns passande klasser

Lösning Husdjur pälsfärg smutsa ned() Hund favoritben ät katt() Kanin slaktvikt Katt klössoffa()

Implikationer av arv Underklassen är en utökad variant av överklassen Underklassen klarar minst allt vad överklassen klarar, oftast mer Underklassen innehåller garanterat all den data som finns i överklassen, dessutom kan extra data finnas

Implikationer av arv Underklassens beteende är mer specialiserat Överklassens beteende är mer generellt Klasser som är mycket generaliserade är ofta abstrakta och kan inte instansieras Husdjur Fordon

Vad ärvs? Medlemsfunktioner ärvs Datamedlemmar ärvs Friends (vänner) ärvs inte Konstruktor ärvs inte Basklassens (överklassen) konstruktor anropas via initieringslistan

Fordon class Fordon { public: Fordon(Person & owner) : m_owner(owner) {} Point GetPosition() { return m_position; } Person & GetOwner() { return m_owner; } protected: Point m_position; Person & m_owner; }; // Fordon initierar owner & position i sin // initieringslista Fordon(Person & owner) : m_position(10,5), m_owner(owner) { }

Bil ärver från Fordon // Ärver från Fordon class Bil : public Fordon { public: Bil(Person & owner); void TurnWheel(float wheel); protected: float m_wheelpos; } // Bilkonstruktorn anropar överklassens konstr. // OBS likheten med initieringslista av variabler Bil::Bil(Person & owner) : Fordon(owner) { m_wheelpos = 0; }

Alltså är en Bil ett Fordon // vi kommer åt alla Fordons medlemsvariabler void Bil::TurnWheel(float wheel) { m_wheelpos = wheel; int x = GetPosition().GetX(); } // vi kan använda m_owner som är deklarerad // i klassen Fordon cout << Bilen med ägare << m_owner.name() << svänger med ratten << endl;

Motorcykel ärver från Fordon // Ärver från Fordon class Motorcykel : public Fordon { public: Motorcykel(Person & owner); void SetColor(int color) { m_color = color; } int GetColor() { return m_color; } protected: int m_color; } // Konstruktorn anropar överklassens Fordon. Motorcykel::Motorcykel(Person & owner) : Fordon(owner) { m_color = 0; }

Gemensamt mellan Motorcykel och Bil Motorcykel och bil har endast Fordon gemensamt Inga andra egenskaper delas mellan objekten Klasser byggs upp i trädstruktur Underklasser är mer specialiserade Underklasserna erbjuder samma gränssnitt som överklasserna

Metodersättning En underklass kan ersätta en metod i överklassen genom att definiera om den i underklassen Överklassens ursprungliga metod kan anropas från underklassen med operatorn :: Exempel: Fordon::GetPosition()

Synligt arv (public) (kap. 9.3) Synliga (public) medlemmar i överklassen blir synliga i underklassen Skyddade (protected) medlemmar i överklassen blir skyddade i underklassen Privata (private) medlemmar i överklassen kommer man inte åt från underklassen

Skyddat arv (protected) Synliga (public) medlemmar i överklassen blir skyddade (protected) i underklassen Skyddade (protected) medlemmar i överklassen blir skyddade i underklassen Privata (private) medlemmar i överklassen kommer man inte åt från underklassen

Privat arv (private) Synliga (public) och Skyddade (protected) medlemmar i överklassen blir privata (private) i underklassen Privata (private) medlemmar i överklassen kommer man inte åt från underklassen

Tillgänglighet översikt i överklass typ av arv i underklass public public public protected public protected private public ej åtkomlig public protected protected protected protected protected private protected ej åtkomlig public private private protected private private private private ej åtkomlig

Minneslayout Nya datamedlemmar läggs till i slutet av klassen, ärvda medlemmar ligger alltid på samma offset i minnet Fordon Person & ägare Point position Bil Person & ägare Point position float wheelpos Motorcykel Person & ägare Point position int color

Statisk allokering! Ett statiskt allokerat objekt har en bestämd storlek reserverat i minnet Ett underklass-objekt kräver mer lagringsutrymme än överklassobjekten för att få rum med de extra datamedlemmarna Slicing uppstår om ett objekt av en överklass tilldelas ett objekt av en underklass All data i underklassen får inte rum, och förkastas därför Undvik genom att använda pekare eller referenser

Exempel (slicing) Person owner( kalle ); Bil b(owner); Fordon f = b; // SLICING!!! Fordon &f = *b; // OK

Exempel (tillgänglighet vid arv) Privat eller skyddat arv class Stack : private Vector { public: void push(elem e) {/* peta i vektorn */} Elem pop() {/* peta i vektorn */} }; // main... Stack s; Elem e,e1,e2; s.push(e1); s.push(e2); e=teststack.pop(); 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);

en stack är inte en vektor Snyggare och bättre med en vektor som beståndsdel (aggregat) istället för arv class Stack { public: push(elem e) { thestack.pushback(e); } Elem pop() { /*... */ } private: Vector thestack; };

Konstruktor (kap. 9.2) När ett objekt skapas sker följande Konstruktorn för ev. överklass anropas alltid först Konstruktorerna för den aktuella klassens datamedlemmar anropas Satserna i den aktuella klassens konstruktor exekveras

Konstruktoranrop Konstruktorn för en överklass kan anropas via underklassens konstruktor Bil::Bil(Person & owner) : Fordon(owner) Om ingen konstruktor för överklassen specificeras anropas överklassens defaultkonstruktor

Destruktor När ett objekt tas bort sker följande Satserna i den aktuella klassens destruktor exekveras Destruktorerna för den aktuella klassens datamedlemmar anropas Destruktorn för ev. överklass anropas

Konstigheter vid arv Funktionsöverlagring Metoder deklarerade i en subklass döljer alla metoder med samma namn i basklassen, oavsett vilka parametrar metoderna har

Arv fördelar (kap. 9.4) Arv kan som vi har sett underlätta programmering genom att olika klasser kan dela på gemensam källkod Arv för även med sig andra fördelar. När ett objekt ärver från en överklass garanterar vi att underklassen klarar allt som överklassen klarar

Användning av arv // skriv ut information om ett fordon void Fordonsinfo(Fordon & fordon) { // alla fordon har en ägare Person & owner = fordon.getowner(); } cout << Fordonet har en ägare vid namn << owner.name(); Person owner1( kalle ); Person owner2( olle ); Bil b(owner1); Motorcykel m(owner2); // vi kan behandla m och b som Fordon Fordonsinfo(b); // skriver ut kalle Fordonsinfo(m); // skriver ut olle

Multipelt arv (kap. 9.10) Klasser kan ärva från mer än en klass För varje klass specificeras om arvet är public, protected eller private Används för att kombinera egenskaper från två eller flera klasser

Exempel (multipelt arv) Amfibiebil ärver alla egenskaper som bil och båt har En Amfibiebil är en Bil och en Båt Bil Båt Amfibiebil

Namnkonflikter När klasser ärver från flera överklasser kan namnkonflikter uppstå Exempel: om både bil och båt har implementerat två metoder som heter Print Namnkonflikterna löses genom att ersätta metoden Print i underklassen och specificera vilken metod i överklassen som skall anropas. Detta löses med exempelvis Bil::Print. Eventuellt kan bägge överklassernas metoder anropas efter varandra

Exempel (Amfibiebil) class Bil { public: Bil(int age) { m_age = age; } void Print() { cout << Bil, årsmodell << m_model; } protected: int m_model; }; class Bat { public: Bat(int length) { m_length = length; } void Print() { cout << Båt, längd << m_length; } protected: int m_length; };

Exempel (Amfibiebil) forts. class Amfibiebil : public Bil, public Bat { public: Amfibiebil(int age, int length) : Bil(age), Bat(length) {} // för att undvika namnkonflikter måste vi // ersätta metoden Print void Print() { // skriv först ut bilinformationen Bil::Print(); // sedan båtinformationen Bat::Print(); } };

Exempel (multipelt arv) Fordon Bil Båt Amfibiebil

Konstigheter med multipelt arv Multipelt arv kan medföra problem i vissa fall Om en klass ärver från två klasser som har en gemensam överklass får underklassen dubblerade data från den gemensamma överklassen Namnkonflikter uppstår för metoder från den gemensamma överklassen Undvik multipelt arv