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

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

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

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

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

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

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

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

Introduktion till arv

TDDC76 - Programmering och Datastrukturer

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

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

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

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

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

Dynamisk bindning och polymorfism

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

TDDC76 - Programmering och Datastrukturer

TDDC76 Programmering och datastrukturer

Arv bakgrund (kap. 9)

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

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

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

Skapa, kopiera och destruera klassobjekt

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

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

OOP Objekt-orienterad programmering

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

5 Arv och dynamisk bindning FIGUR

Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Klasshierarkier - repetition

Arv. Objektorienterad och komponentbaserad programmering

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

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

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

allokeras på stacken dynamiskt new delete

Konstruktion av klasser med klasser

Programsystemkonstruktion med C++

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Classes och Interfaces, Objects och References, Initialization

Synlighet. Namespace Scope-operatorn Klasser Vänner

DAT043 - Föreläsning 7

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

Polymorfi. Objektorienterad och komponentbaserad programmering

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

Objektorientering - Arv och polymorfi

OOP Objekt-orienterad programmering

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

TDIU01 Programmering i C++

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

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

Tentamen EDAF30 Programmering i C++

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

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

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

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

Tillämpad programmering

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

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

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

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

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 13 Innehåll

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

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

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

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

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

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

Klasshierarkier. Klasser kan byggas på redan definierade klasser

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

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

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Arv och polymorfi. Lite terminologi; Basklass eller superklass: En klass som fungerar som bas för vårt arv. Vi skapar nya klasser utifrån den.

Kopiering av objekt i Java

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

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

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

TDDC76 - Programmering och Datastrukturer

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

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

F8: Typkonvertering i C++

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

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

Tillämpad programmering

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

Objektorienterad Programmering (TDDC77)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Kapitel 6 - Undantag

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

DD2387 Programsystemkonstruktion med C++ Tentamen 2

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

Transkript:

Innehåll EDAF30 Programmering i C++ Arv. Polymorfism. Sven Gestegård Robertz Datavetenskap, LTH 2015 1 Kort om dynamisk polymorfism Virtuella funktioner 2 Arv i C++ Konstruktorer och destruktorer Tillgänglighet Arv utan polymorfism Fallgropar 3 Multipelt arv 4 Något om statisk polymorfism Parametriserade klasser Parametriserade funktioner Arv. Polymorfism. 2/1 Polymorfism och dynamisk bindning Arv. Generalisering och specialisering Polymorfism (mångformighet) Överlagring Generiska programenheter (templates) Virtuella funktioner Statisk bindning Statisk bindning Dynamisk bindning Generalisering: abstrahera gränssnitt Specialisering: återanvändning och utökning Statisk bindning: Dynamisk bindning: Betydelsen hos en viss konstruktion avgörs vid kompilering Betydelsen hos en viss konstruktion avgörs vid exekvering Relationen är: En bil är ett fordon Arv. Polymorfism. 3/37 Arv. Polymorfism. 4/37 Konkreta typer uppför sig precis som inbyggda typer : Representationen ingår i definitionen 1 Kan placeras på stacken, och i andra objekt Kan refereras till direkt (och inte bara genom pekare eller referenser) Kod som använder den måste kompileras om om typen ändras Detta är en kort introduktion, mer om mallar kommer i senare föreläsning. Abstrakta typer isolerar användaren från implementationsdetaljer och skiljer gränssnittet från representationen: Representationen av objekt (inkl. storleken!) är okänd Måste allokeras på heapen Kan bara refereras via pekare eller referenser 1 kan vara privat, men är känd Kort om dynamisk polymorfism : Arv. Polymorfism. 5/37 En konkret typ: Vektor class Vektor Vektor ( int l = 10) :p new int [l], antl ~ Vektor () delete [] p; int lngd () const return ant ; int & operator []( int i) assert (i<ant ); return p[i]; int *p; int ant; Generalisering: extract interface class Container int lngd () const ; int & operator []( int o); Kort om dynamisk polymorfism : Arv. Polymorfism. 6/37

Generalisering: en abstrakt typ, Container class Container virtual int lngd () const =0; virtual int & operator []( int o) =0; virtual ~ Container () pure virtual funktion Abstrakt klass eller interface i Java class Vektor : Container Vektor ( int l = 10) :p new int [l], ant l ~ Vektor () delete [] p; int lngd () const override return ant ; int & operator []( int i) override assert (i<ant ); return p[i]; int *p; int ant ; extends (eller implements) Container i Java override motsvarar @Override i Java (C++11) En polymorf typ måste ha en virtuell destruktor Variant, utan att ändra Vektor Om vi inte kan (eller vill) ändra klassen Vektor kan vi använda den för att skapa en ny klass: class Vektor_container : Container Vektor_container ( int l = 10) :vl ~ Vektor_container () int lngd () const override return v.lngd (); int & operator []( int i) override return v[i]; Vektor v; Vektor är en konkret klass Notera att v är ett Vektor-objekt, inte en referens Skillnad från Java Vektors destruktor (för v) anropas implicit Kort om dynamisk polymorfism : Virtuella funktioner Arv. Polymorfism. 7/37 Kort om dynamisk polymorfism : Virtuella funktioner Arv. Polymorfism. 8/37 Användning av abstrakta klassen void fill ( Container & c, int v) for (int i =0; i!=c. lngd (); ++i) c[i] = v; void print ( Container & c) for (int i =0; i!=c. lngd (); ++i) cout << c[i] << " " ; cout << endl ; void test_container () Vektor v (10) ; fill (v,3); Kort om dynamisk polymorfism : Virtuella funktioner Arv. Polymorfism. 9/37 Användning av abstrakta klassen Anta nu att vi har två andra subklasser till Container class MyArray : Container... class List : Container... void test_container () Vektor v (10); fill (v); MyArray a (5); fill (a); print (a); List l1,2,3,4,5,6,7 print (l); Dynamisk bindning av Container::lngd() och Container::operator[]() Kort om dynamisk polymorfism : Virtuella funktioner Arv. Polymorfism. 10/37 Dynamisk bindning Regler för basklassens konstruktor virtuell funktions-tabell(vtbl) innehåller pekare till objektets virtuella funktioner varje klass med någon virtuell medlemsfunktion har en vtbl varje objekt har en pekare till klassens vtbl anrop av en virtuell funktion (typiskt) < 25% dyrare Vektor_container: v.ant v.p vtbl: Vektor_container::lgnd() Vektor_container::operator[]() Vektor_container:: Vektor_container Basklassens default-konstruktor anropas implicit om den finns! Argument till basklassens konstruktor ges i initierar-listan i subklassens konstruktors. basklassens namn måste används. (super() som i Java finns inte p g a multipelt arv.) List:... vtbl: List::lgnd() List::operator[]() List:: List Kort om dynamisk polymorfism : Virtuella funktioner Arv. Polymorfism. 11/37 Arv i C++ : Konstruktorer och destruktorer Arv. Polymorfism. 12/37

Initieringsordning i en konstruktor (för härledd klass) 1 Basklassen initieras: Basklassens konstruktor anropas 2 Subklassen initieras: Datamedlemmar (i subklassen) initieras 3 Funktionskroppen i subklassens konstruktor exekveras Explicit anrop av basklassens konstruktor i initieringslistan D::D( param...) :B( param...),...... Notera: Konstruktorer ärvs inte Anropa inte virtuella funktioner från en konstruktor.: I basklassen B är this av typen B*. B D Konstruktorer ärvs inte class Base Base (int i) :xi virtual void print () cout << " Base : " << x << endl ; int x; class Derived : Base void test_ctors () Derived b (5); // no matching function for call to // Derived :: Derived (int) Derived b2; // use of deleted function Derived :: Derived () Arv i C++ : Konstruktorer och destruktorer Arv. Polymorfism. 13/37 Arv i C++ : Konstruktorer och destruktorer Arv. Polymorfism. 14/37 using: gör basklassens konstruktor synlig (C++11) class Base Base (int i) :xi virtual void print () cout << " Base : " << x << endl ; int x; class Derived : Base using Base :: Base ; void test_ctors () Derived b2 (5); // OK! Derived b; // use of deleted function Derived :: Derived () b. print (); Arv i C++ : Konstruktorer och destruktorer Arv. Polymorfism. 15/37 Nu med default-konstruktor class Base Base (int i=0) :xi virtual void print () cout << " Base : " << x << endl ; int x; class Derived : Base using Base :: Base ; void test_ctors () Derived b; // OK! b. print (); Derived b2 (5); // OK! b2. print (); Arv i C++ : Konstruktorer och destruktorer Arv. Polymorfism. 16/37 Destruktorer vid arv Tillgänglighet Destruktorn görs i omvänd ordning: Exekveringsordning i en destruktor 1 Funktionskroppen i subklassens destruktor exekveras 2 Subklassens medlemmar destrueras 3 Basklassens destruktor anropas De olika nivåerna av tillgänglighet class C // Medlemmar å tkomliga från godtyckliga funktioner protected : // Medlemmar å tkomliga från medlemsfunktioner // i klassen eller hä rledda klasser // Medlemmar å tkomliga endast från // klassens egna medlemsfunktioner Arv i C++ : Konstruktorer och destruktorer Arv. Polymorfism. 17/37 Arv i C++ : Tillgänglighet Arv. Polymorfism. 18/37

Tillgänglighet Tillgänglighet Tillgänglighet vid arv Tillgänglighet vid arv class D1 : B // Publikt arv class D2 : protected B // Skyddat arv class D3 : B // Privat arv Tillgänglighet i B Tillgänglighet via D Publikt arv protected protected protected Skyddat arv protected protected Privat arv protected Tillgängligheten inuti D påverkas inte av typen av arv Arv i C++ : Tillgänglighet Arv. Polymorfism. 19/37 Arv i C++ : Tillgänglighet Arv. Polymorfism. 20/37 Funktionsöverlagring och arv Arv utan virtuella funktioner Funktionsöverlagring fungerar ej mellan olika nivåer i arvshierarkin class C1 void f( int ); // C1 ::f class C2 : C1 void f (); // C2 ::f (dö ljer C1 ::f) C1 a; C2 b; a.f (5); // Ok b.f (); // Ok b.f (2) // Fel! C1 ::f är dold! I C++ är medlemsfunktioner inte virtuella om det inte anges. (Skillnad från Java) Man kan ärva från en klass och dölja dess funktioner. Man kan explicit anropa funktioner i superklassen. Kan användas för att utöka en funktion. (Lägga till saker före och efter funktionen.) Arv i C++ : Tillgänglighet Arv. Polymorfism. 21/37 Arv i C++ : Arv utan polymorfism Arv. Polymorfism. 22/37 Arv utan virtuella funktioner Exempel Fallgropar struct Clock Clock (int h, int m, int s) : seconds 60*(60* h+m) + s Clock & tick (); // OBS! Inte virtuell int get_ticks () return seconds ; int seconds ; struct AlarmClock : Clock using Clock :: Clock ; void setalarm ( int h, int m, int s); AlarmClock & tick (); // dö ljer Clock :: tick () void soundalarm (); int alarmtime ; Typomvandling Tilldelning eller kopiering av objekt av konkreta typer AlarmClock & AlarmClock :: tick () Clock :: tick (); // explicit anrop av funktion i superklassen if( get_ticks () == alarmtime ) soundalarm (); return * this ; Arv i C++ : Arv utan polymorfism Arv. Polymorfism. 23/37 Arv i C++ : Fallgropar Arv. Polymorfism. 24/37

Typomvandling Object slicing Se upp med typomvandlingar Framför allt (Subklass*) BasklassPekare Inget skyddsnät, ingen ClassCastException Se exempel i C++ direkt, kap 9.1 (s 307) Använd dynamic_cast (returnerar nullptr om ej OK) Vektor v; Container * c = &v; if( dynamic_cast < Vektor *>(c)) cout << " *c instanceof Vektor \n"; typeid motsvarar.getclass() i Java if(typeid (*c) == typeid ( Vektor )) cout << " *c is a Vektor \n"; class A... class B : A... B b; A a = b; Inte farligt, men a innehåller bara A-delen av b B b1; B b2; A& a_ref = b2; a_ref = b1; Fel! b2 innehåller nu A-delen av b1 och B-delen av sitt gamla värde. Arv i C++ : Fallgropar Arv. Polymorfism. 25/37 Arv i C++ : Fallgropar Arv. Polymorfism. 26/37 Object slicing struct A A( int a) : a_var (a) int a_var ; virtual void print () cout << "A(" <<a_var <<")\n"; struct B : A B( int a, int b) : A(a), b_var (b) int b_var ; void print () cout << "B(" <<a_var <<"," <<b_var <<")\n"; B b1 (1,2); B b2 (98,99); A& ar = b2; b2. print (); ar = b1; b2. print (); B (98,99) B (1,99) Arv i C++ : Fallgropar Arv. Polymorfism. 27/37 Object slicing Lösning med virtuell operator= struct A virtual A& operator =( const A& a) assign (a); return * this ; protected : void assign ( const A& a); // assign As members ; struct B : A virtual B& operator =( const A& a) if( const B* b = dynamic_cast < const B* >(&a)) assign (*b); else // handle bad assignment to B return * this ; protected : void assign ( const B& b) A:: assign (b); // assign Bs members Arv i C++ : Fallgropar Arv. Polymorfism. 28/37 Multipelt arv En klass kan ärva från flera basklasser Jfr. implementera flera interface i Java The diamond problem Hur många MotorVehicle ingår i en MiniBus? Multipelt arv Hur många MotorVehicle ingår i en MiniBus? class MotorVehicle... class Bus : MotorVehicle... class Car : MotorVehicle... class MiniBus : Bus, Car... MotorVehicle MotorVehicle Bus Car Bus MiniBus Car MiniBus Multipelt arv Arv. Polymorfism. 29/37 Multipelt arv Arv. Polymorfism. 30/37

Multipelt arv The diamond problem Multipelt arv Virtuellt arv Virtuellt arv : Subklasser delar instans av basklassen. (Basklassen tas bara med en gång) Den gemensamma basklassen tas med flera gånger Flera upplagor av medlemsvariabler Medlemsfunktioner måste användas som Basklass::funktion() för att undvika tvetydighet om inte virtuellt arv används class MotorVehicle... class Bus : virtual MotorVehicle... class Car : virtual MotorVehicle... class MiniBus : Bus, Car... MotorVehicle Bus Car MiniBus Multipelt arv Arv. Polymorfism. 31/37 Multipelt arv Arv. Polymorfism. 32/37 Parametriserade typer och funktioner Templates (mallar) Klassmallar Funktionsmallar Kompilatorn skapar nya typer vid instansiering Detta är en kort introduktion, mer om mallar kommer i en senare föreläsning. Parametriserade typer och funktioner Exempel: parametriserad Vektor template <typename T> class Vektor Vektor ( int l = 10) :p new T[l], antl ~ Vektor () delete [] p; int lngd () const return ant ; T& operator []( int i) return p[i]; T* p; int ant; Användning: Vektor <int > iv; Vektor <Foo > fv; int i = iv [4]; Foo& F = fv [2]; Något om statisk polymorfism : Parametriserade klasser Arv. Polymorfism. 33/37 Från tidigare: Användning av abstrakta klassen Container Något om statisk polymorfism : Parametriserade klasser Arv. Polymorfism. 34/37 Parametriserade typer och funktioner Exempel: parametriserade funktioner void print ( Container & c) for (int i =0; i!=c. lngd (); ++i) cout << c[i] << " " ; cout << endl ; void test_container () Vektor v (10); template <typename T> void print (T& t) for (int i=0; i!= t. lngd (); ++i) cout << t[i] << " "; cout << endl ; Användning: Vektor <int > iv; Vektor <Foo > fv; print (iv ); print (fv ); Kompilatorn skapar (instansierar) funktionerna print(vektor<int>) och print(vektor<foo>). Något om statisk polymorfism : Parametriserade funktioner Arv. Polymorfism. 35/37 Något om statisk polymorfism : Parametriserade funktioner Arv. Polymorfism. 36/37

Vi har talat om Virtuella fuktioner Arv i C++ Nästa föreläsning: Vi kommer att introducera exceptions och studera standard-klasserna för I/O Något om statisk polymorfism : Parametriserade funktioner Arv. Polymorfism. 37/37