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

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

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 Arv. EDA623 (Föreläsning 6) HT / 42

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

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

Innehåll. Pekare Exempel

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

Innehåll. Pekare Exempel

Arv bakgrund (kap. 9)

Skapa, kopiera och destruera klassobjekt

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

TDDC76 - Programmering och Datastrukturer

Introduktion till arv

Dynamisk bindning och polymorfism

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

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

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

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

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

TDDC76 - Programmering och Datastrukturer

TDDC76 Programmering och datastrukturer

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

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

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

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

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

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

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

TDIU01 Programmering i C++

Objektorientering - Arv och polymorfi

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

DAT043 - Föreläsning 7

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

allokeras på stacken dynamiskt new delete

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

OOP Objekt-orienterad programmering

5 Arv och dynamisk bindning FIGUR

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

Klasshierarkier - repetition

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

Lektionsuppgifter. TDDI14 Objektorienterad programmering. Lektionsplanering Lektion Lektion Lektion

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

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Arv. Objektorienterad och komponentbaserad programmering

Classes och Interfaces, Objects och References, Initialization

Föreläsning 13 Innehåll

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

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

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

TDDC76 - Programmering och Datastrukturer

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

Tillämpad programmering

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

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

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

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

Programsystemkonstruktion med C++

Konstruktion av klasser med klasser

OOP Objekt-orienterad programmering

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

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

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

Kopiering av objekt i Java

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

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

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

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

Polymorfi. Objektorienterad och komponentbaserad programmering

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

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

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

F8: Typkonvertering i C++

TDDC76 PoD OH Föreläsning C Härledda klasser

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

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

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

Innehåll. Pekare Syntax

Synlighet. Namespace Scope-operatorn Klasser Vänner

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

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

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

Objektorienterad Programmering (TDDC77)

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

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

Tentamen EDAF30 Programmering i C++

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

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

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

Objektorienterad programmering i Java I

Objektorienterad programmering

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

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 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

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

Objektorienterad Programmering (TDDC77)

Trädtraversering. Binärt träd. Trädtraversering djupet-först. Trädtraversering bredden-först

Transkript:

Innehåll EDAF30 Programmering i C++ 9. Polymorfism och arv Sven Gestegård Robertz Datavetenskap, LTH 2017 1 Klasser Polymorfism och arv Konstruktorer och destruktorer Tillgänglighet Arv utan polymorfism Fallgropar 2 Multipelt arv 3 Mer om polymorfa typer 9. Polymorfism och arv 2/1 Regler för basklassens konstruktor 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.) 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 Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 3/36 Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 4/36 Konstruktorer ärvs inte class Base Base (int i) :xi virtual void print () cout << " Base : " << x << endl ; : 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 () using: gör basklassens konstruktor synlig (C++11) class Base Base (int i) :xi virtual void print () cout << " Base : " << x << endl ; : class Derived : Base using Base :: Base ; void test_ctors () Derived b2 (5); // OK! Derived b; // use of deleted function Derived :: Derived () b. print (); Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 5/36 Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 6/36

Ärvda konstruktorer regler Nu med default-konstruktor class Base Base (int i=0) :xi virtual void print () cout << " Base : " << x << endl ; : class Derived : Base using Base :: Base ; using gör att alla superklassens konstruktorer ärvs, utom de som döljs av subklassen (har samma parametrar) default- copy- och move-konstruktorer ärvs inte om de inte definieras, syntetiseras de som vanligt default-parametrar i superklassen ger flera ärvda konstruktorer void test_ctors () Derived b; // OK! b. print (); Derived b2 (5); // OK! b2. print (); Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 7/36 Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 8/36 Kopiering och arv Destruktorer vid arv Kopieringskonstruktorn ska kopiera hela objektet typiskt: anropa superklassens kopierings-konstruktor Samma sak gäller för operator= Skillnad mot destruktorn En destruktor i en subklass ska bara avallokera det som allokerats i subklassen. Basklassens destruktor anropas implicit. En subklass kan inte kopieras om superklassen saknar (d v s är eller =delete) default-konstruktor, copy-konstruktor, copy-assignment operator eller destruktor Basklasser bör definiera dessa =default 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 I basklassen ska destruktorn vara virtuell Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 9/36 Klasser : Konstruktorer och destruktorer 9. Polymorfism och arv 10/36 Tillgänglighet Tillgänglighet 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 Tillgänglighet vid arv class D1 : B // Publikt arv class D2 : protected B // Skyddat arv class D3 : B // Privat arv Klasser : Tillgänglighet 9. Polymorfism och arv 11/36 Klasser : Tillgänglighet 9. Polymorfism och arv 12/36

Tillgänglighet Funktionsöverlagring och arv Tillgänglighet vid 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 Klasser : Tillgänglighet 9. Polymorfism och arv 13/36 Funktionsöverlagring och arv Gör namn i superklass synliga med using Funktionsöverlagring fungerar ej som vanligt mellan olika nivåer i arvshierarkin class C1 void f( int ) cout << "C1 ::f(int )\n"; class C2 : C1 void f(); cout << "C2 ::f( void )\n"; C1 a; C2 b; a.f (5); // Ok, anropar C1 ::f(int) b.f(); // Ok, anropar C2 ::f( void ) b.f(2) // Fel! C1 ::f är dold! b.c1 ::f (10); // Ok Klasser : Tillgänglighet 9. Polymorfism och arv 14/36 Arv och scope Funktionsöverlagring mellan olika nivåer i arvshierarkin class C1 void f( int ); cout << "C1 ::f( int )\n"; class C2 : C1 using C1 ::f; void f (); cout << "C2 ::f( void )\n"; C1 a; C2 b; a.f (5); // Ok, anropar C1 ::f( int ) b.f (); // Ok, anropar C2 ::f( void ) b.f (2) // Ok, anropar C1 ::f( int ) En subklass scope är kapslat (eng: nested) inuti superklassens Namn i superklassen syns i subklasser om de inte döljs av samma namn i subklassen Använd scope-operatorn :: för att komma åt dolda namn Namnuppslagning sker vid kompilering Statisk typ för en pekare eller referens styr vilka namn som syns (som i Java) Virtuella funktioner måste ha samma parametertyper i subklasser Klasser : Tillgänglighet 9. Polymorfism och arv 15/36 Klasser : Tillgänglighet 9. Polymorfism och arv 16/36 Arv utan virtuella funktioner 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 utan virtuella funktioner 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 ; AlarmClock & AlarmClock :: tick () Clock :: tick (); // explicit anrop av funktion i superklassen if( get_ticks () == alarmtime ) soundalarm (); return * this ; Klasser : Arv utan polymorfism 9. Polymorfism och arv 17/36 Klasser : Arv utan polymorfism 9. Polymorfism och arv 18/36

Fallgropar Typomvandling Typomvandling Tilldelning eller kopiering av objekt av konkreta typer Se upp med typomvandlingar Framför allt (Subklass*) BasklassPekare Inget skyddsnät, ingen ClassCastException 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"; Klasser : Fallgropar 9. Polymorfism och arv 19/36 Klasser : Fallgropar 9. Polymorfism och arv 20/36 Object slicing Object slicing class Point... class Point3d : Point... Point3d b; Point a = b; Inte farligt, men a innehåller bara Point-delen av b Point3d b1; Point3d b2; Point & point_ref = b2; point_ref = b1; Fel! b2 innehåller nu Point-delen av b1 och Point3d-delen av sitt gamla värde. Klasser : Fallgropar 9. Polymorfism och arv 21/36 struct Point Point (int xi, int yi) :xxi, yyi virtual void print () const ; // prints Point (x,y) int y; struct Point3d : Point Point3d (int xi, int yi, int zi) : Point (xi,yi), zzi virtual void print () const ; // prints Point3d (x,y,z) int z; void test_slicing () Point3d q1 1,2,3 Point3d q2 3,4,5 q2. print (); Point3d(3,4,5) Point & pr = q2; pr = q1; q2. print (); Point3d(1,2,5) Lösning: virtuell operator= Klasser : Fallgropar 9. Polymorfism och arv 22/36 Object slicing Lösning med virtuell operator= struct Point... virtual Point & operator =( const Point & p) = default ; struct Point3d : Point... virtual Point3d & operator =( const Point & p) noexcept ; Point3d & Point3d :: operator =( const Point & p) noexcept Point :: operator =(p); auto p3d = dynamic_cast < const Point3d * >(&p); if(p3d ) z = p3d ->z; else z = 0; return * this ; Multipelt arv En klass kan ärva från flera basklasser Jfr. implementera flera interface i Java Som i Java om max en av basklasserna har medlemsvariabler Kan bli besvärligt annars The diamond problem Hur många MotorVehicle ingår i en MiniBus? Bus MotorVehicle MiniBus Car Klasser : Fallgropar 9. Polymorfism och arv 23/36 Multipelt arv 9. Polymorfism och arv 24/36

Multipelt arv Hur många MotorVehicle ingår i en MiniBus? Multipelt arv The diamond problem class MotorVehicle... class Bus : MotorVehicle... class Car : MotorVehicle... class MiniBus : Bus, Car... MotorVehicle Bus Car 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 MiniBus string Bus::regno; int Bus::weight; string Car::regno; int Car::weight; Multipelt arv 9. Polymorfism och arv 25/36 Multipelt arv 9. Polymorfism och arv 26/36 Multipelt arv Virtuellt arv Virtuellt arv : Subklasser delar instans av basklassen. (Basklassen tas bara med en gång) class MotorVehicle... class Bus : virtual MotorVehicle... class Car : virtual MotorVehicle... class MiniBus : Bus, Car... MotorVehicle Bus Car Polymorfa typer Gränssnitt definieras av en (abstrakt) basklass Abstrakta typer isolerar användaren från implementationsdetaljer och skiljer gränssnittet från representationen: Representationen av objekt (inkl. storleken!) är okänd Kan bara refereras via pekare eller referenser Måste (typiskt) allokeras på heapen objekt av en abstrakt typ kan inte skapas factory-metod måste returnera pekare eller referens objekt på stacken blir inte polymorfa... undantag: referensanrop MiniBus Multipelt arv 9. Polymorfism och arv 27/36 Mer om polymorfa typer 9. Polymorfism och arv 28/36 class Animal void speak () const cout << get_sound () << endl ; virtual string get_sound () const =0; virtual ~ Animal () = default ; class Dog : Animal string get_sound () const override return "Woof!"; class Cat : Animal string get_sound () const override return "Meow!"; class Bird : Animal string get_sound () const override return "Tweet!"; class Cow : Animal string get_sound () const override return "Moo!"; polymorfa typer 9. Polymorfism och arv Mer om 29/36 d. speak (); Woof! c. speak (); Meow! b. speak (); Tweet! w. speak (); Moo! Mer om polymorfa typer 9. Polymorfism och arv 30/36

Container med polymorfa objekt Använd pekare vector <Animal > zoo d,c,b,w for ( auto x : zoo ) x. speak (); vector <Animal *> zoo &d,&c,&b,&w for ( auto x : zoo ) x-> speak (); Woof! Meow! Tweet! Moo! error : cannot allocate an object of abstract type Animal Mer om polymorfa typer 9. Polymorfism och arv 31/36 Mer om polymorfa typer 9. Polymorfism och arv 32/36 Referensanrop Nästa föreläsning void test_polymorph ( const Animal & a) a. speak (); Generisk programmering 16.1, 16.3 test_polymorph (d); test_polymorph (c); test_polymorph (b); test_polymorph (w); Woof! Meow! Tweet! Moo! Mer om polymorfa typer 9. Polymorfism och arv 33/36 Mer om polymorfa typer 9. Polymorfism och arv 34/36 Läsanvisningar Referenser till relaterade avsnitt i Lippman Dynamisk poymorfism och arv kapitel 15 15.4 Tillgänglighet och scope kapitel 15.5 15.6 Typomvandling och arv kapitel 15.2.3 Arv och resurshantering 15.7 Polymorfa typer och containers 15.8 Multipelt arv 18.3 Virtuella basklasser 18.3.4 18.3.5 Mer om polymorfa typer 9. Polymorfism och arv 35/36