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

Relevanta dokument
Arv bakgrund (kap. 9)

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

Dynamisk bindning och polymorfism

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

Introduktion till arv

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

TDDC76 - Programmering och Datastrukturer

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

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

TDDC76 Programmering och datastrukturer

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

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

Objektorienterad programmering Föreläsning 12. Copyright Mahmud Al Hakim

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

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

Polymorfi. Objektorienterad och komponentbaserad programmering

TDDC76 - Programmering och Datastrukturer

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

5 Arv och dynamisk bindning FIGUR

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

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

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

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

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

1 Klasser och objektorientering Vad är objektorientering?

Klasshierarkier - repetition

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

Skapa, kopiera och destruera klassobjekt

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

Föreläsning 13 Innehåll

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

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

Objektorienterad Programmering (TDDC77)

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

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

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

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

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

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

Objektorienterad programmering

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

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

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

OOP Objekt-orienterad programmering

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

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

Arv. Objektorienterad och komponentbaserad programmering

Innehåll. Pekare Exempel

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

TDDC76 - Programmering och Datastrukturer

Innehåll. Pekare Exempel

OOP Objekt-orienterad programmering

TDIU01 Programmering i C++

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

Objektorienterad Programmering (TDDC77)

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

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

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

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

Objektorienterad programmering. Grundläggande begrepp

Joppes djurfamilj v2. Planering. Genomförande. Utvärdering och dokumentation

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

Repetition av OOP- och Javabegrepp

Programsystemkonstruktion med C++

Repetition av OOP- och Javabegrepp

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

TENTAMEN OOP

Objektorienterad Programmering (OOP) Murach s: kap 12-16

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

Föreläsningsmaterial (Arv) Skrivet av Andreas Lund

C++ Objektorientering - Klasser. Eric Elfving

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

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

Laboration 1: Figurer i hierarki

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

TENTAMEN OOP

Objektorientering - Arv och polymorfi

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

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

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

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

allokeras på stacken dynamiskt new delete

DAT043 - Föreläsning 7

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Arv och polymorfism i Java

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Tentamen EDAF30 Programmering i C++

Abstrakt klass. DD2385 Programutvecklingsteknik Några bilder till föreläsning 4 31/ Exempel: Implementation av Schackpjäser.

OOP Tenta

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Transkript:

Föreläsning 5

Problemet Vi har sett att vi kan ersätta de metoder vi ärver från överklassen med egen funktionalitet (polymorfism) class Bil : public Fordon Bil(Person & owner) : Fordon(owner) } // Den nya versionen av GetPosition skall // returnera fordonets position förskjutet // 3 enheter i bägge axlar Point GetPosition() return Point(m_position).Offset(3,3); }

Problemet Vad händer då en funktion som tar emot Fordon får en Bil som parameter? void fordonsinfo(fordon & fordon) // vad händer om fordon är ett objekt av // klassen Bil? // skriver vi ut positionen som ges av // Fordon::GetPosition() eller // Bil::GetPosition()? cout << fordon.getposition();

Problemet svar Metoden Fordon::GetPosition används Detta beror på att allt funktionen fordonsinfo vet om är att det är ett fordon som har skickats som parameter. Problemet orsakas av statisk bindning Default-beteende i C++ Vid kompileringstillfället bestäms det att Fordon::GetPosition() skall användas

Problemet önskat resultat I de flesta fall vill man att objektets mest aktuella metod skall exekveras, inte en gammal metod från någon överklass I vårat fall vill vi att Bil::GetPosition() skall användas istället

Problemet lösning Om man istället vid exekveringstillfället (run-time) bestämmer vilken funktion som skall användas kan vi få önskat resultat Dynamisk bindning Vi vill använda oss av metoduppslagning

Problemet lösning forts. C++ erbjuder en lösning för dynamisk bindning av metoder Nyckelordet virtual framför en metod säger åt C++ att metoduppslagning skall användas för denna specifika metod virtual metoder ärvs, dvs är en metod virtuell i överklassen så är den virtuell i underklasserna

Exempel (virtuell metod) class Fordon public: Fordon() : m_position(0,0) } virtual Point GetPosition() return m_position; } protected: Point m_position; class Bil : public Fordon public: Bil() } // Inget anrop av Fordon() behövs virtual Point GetPosition() return Point(m_position).Offset(3,3); }

Problemet följder Dynamisk bindning är inte lika effektivt som statisk bindning stor anledning till att statisk bindning är default i C++ Dagens processorer hanterar dynamisk bindning mycket effektivt Inte längre lika stor nackdel

Husdjur class Pet public: virtual void mess_up() // Släpp hår överallt } protected: Color m_color;

Kanin class Rabbit : public Pet public: // vi ärver alla metoder från Pet protected: Carrot m_favoritecarrot;

Hund class Dog : public Pet public: void eat_cat(); virtual void mess_up() // Bit sönder saker // Kräks på nya mattan } protected: Bone m_favoritebone;

Katt class Cat : public Pet public: void scratch_sofa(); virtual void mess_up() // släpa in möss // gör dessutom som alla andra Pet::mess_up(); } protected:

Pure virtual Antag att man inte kan bestämma beteende för en virtuell funktion i en överklass Exempelvis: Pet::mess_up() har ingen bestämd definition. Metoden kan då deklareras som rent virtuell (pure virtual) mess_up() = 0; Tvingar alla underklasser att implementera metoden mess_up()

Exempel (pure virtual) Vi finner inget passande standardbeteende för när husdjur stökar till mess_up() blir en pure virtual metod class Pet public: virtual void mess_up() = 0; protected: Color m_color;

Exempel (pure virtual) forts. Vilket även innebär att alla underklasser måste implementera mess_up() class Rabbit : public Pet public: virtual void mess_up() // Släpp hår överallt } protected: Carrot m_favoritecarrot;

Abstrakt överklass Klass som innehåller en/flera rent virtuella metoder Klasser med rent virtuella metoder kan ej instansieras Exempel: Husdjur, hur skulle detta objekt se ut? Underklass måste komplettera klassen för att kunna instansieras Referenser/pekare till objekt av överklassen kan ändå anropa de rent virtuella metoderna

Rent abstrakt överklass Alla medlemmar är rent virtuella (pure virtual) Definierar ett gränssnitt som arvtagare måste implementera (för att kunna instansieras)

Virtuella destruktorer När man använder virtuella metoder i en klass bör man ta som vana att även deklarera destruktorn virtuell. Om man misstänker att klassen skall användas polymorft bör man även skapa en virtuell destruktor Att inte skapa en virtuell destruktor kan i vissa fall få förödande konsekvenser

Lillhjärna class Cerebellum // Lillhjärnan public: ~Cerebellum() cout << Signing off ; } virtual void react() fight(); eat(); sleep(); reproduce(); } void fight(); void sleep(); void eat(); void reproduce();

Storhjärna class Cerebrum : public Cerebellum // Storhjärnan public: Cerebrum() m_mem = new Memory(); } ~Cerebrum() delete m_mem; } virtual void react() switch(think()) case 0: eat(); break; case 1: sleep(); break; case 2: reproduce(); break; } } int think(); // return appropriate action protected: Memory *m_mem;

Destruktorhaveri void main() Cerebellum * lill = new Cerebellum(); Cerebrum * stor = new Cerebrum(); } squash(lill); // anropar lill-destruktor squash(stor); // anropar lill-destruktor // missar alltså stor-destruktorn pga att // destruktorn inte är virtual void squash(cerebellum * brain) // statisk bindning (~Cerebellum) delete brain; }

Lösning Lösningen på problemet med felaktigt destruktoranrop är givetvis att göra destruktorn virtual

Virtuellt arv Fordon Bil Båt När man ärver multipelt från två eller fler klasser med gemensamma överklasser uppstår datadubblering För att undvika detta kan man ärva klasser virtuellt, vilket gör att alla klasser i arvshierarkin endast finns med i en uppsättning Amfibiebil

Exempel (virtuellt arv) class Fordon public: Fordon(Person & owner); Point GetPosition() return m_position; } Person & GetOwner() return m_owner; } protected: Point m_position; Person & m_owner;

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

Exempel (multipelt arv) Klassen ärver multipelt precis som tidigare (får nu en uppsättning fordonsegenskaper) 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() Bil::Print(); Bat::Print(); }

Sammanfattning virtuellt arv Virtuellt arv måste specificeras redan på den nivån i klasshierarkin där de ärver från samma klass. Dubblering av data kan undvikas genom att ärva virtual Varje datamedlemsaccess sker virtuellt Prestandaförsämring, värre än virtuella funktioner

Interface-klasser Klasser utan datamedlemmar Mestadels rent virtuella metoder Kan ha enklare virtuella metoder med implementation Undviker problem vid multipelt arv eftersom ingen data kan dubbleras Ärv maximalt en klass med implementation, resten Interface-klasser Namnkollisionsproblematiken kvarstår dock

Sammanfattning Polymorf metod (polymorfism) metod med många former Egenskapen att kunna ha flera olika beteenden beroende på objekt Ersättning av metoder i underklasser Statisk bindning Kompilatorn bestämmer vid kompileringstillfället vilken metod som skall anropas

Sammanfattning forts. Dynamisk bindning Programmet avgör vilken metod som skall anropas först när programmet kör (runtime) Åstadkoms i C++ genom virtual Inte lika effektivt som statisk bindning, men inte så allvarligt på dagens processorer