Dynamisk bindning och polymorfism

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

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

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

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

Introduktion till arv

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

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

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

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

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

TDDC76 - Programmering och Datastrukturer

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

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

5 Arv och dynamisk bindning FIGUR

Skapa, kopiera och destruera klassobjekt

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

Arv. Objektorienterad och komponentbaserad programmering

Innehåll. Pekare Exempel

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

Innehåll. Pekare Exempel

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

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

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

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

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

Klasshierarkier - repetition

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

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

Java, klasser, objekt (Skansholm: Kapitel 2)

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

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

allokeras på stacken dynamiskt new delete

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

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Föreläsning 5-6 Innehåll

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

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

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

Övningar Dag 2 En första klass

Classes och Interfaces, Objects och References, Initialization

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

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

OOP Objekt-orienterad 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

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

Programsystemkonstruktion med C++

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

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

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

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

Kapitel 6 - Undantag

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

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

TDDC76 - Programmering och Datastrukturer

Arv bakgrund (kap. 9)

TDDC76 - Programmering och Datastrukturer

JAVA Mer om klasser och objektorientering

OOP Objekt-orienterad programmering

TDIU01 - Programmering i C++, grundkurs

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

TDDC76 Programmering och datastrukturer

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

3. Minneshantering - (copy)konstruktorn, destruktorn och tilldelningsoperatorn

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

C++ Objektorientering - Klasser. Eric Elfving

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Objekt och klasser - Introduktion

DAT043 - Föreläsning 7

Funktionens deklaration

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

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

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

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

Collections Collections "Envisa" objekt Klasserna Bofstream och Bifstream Definition av metoder i klasserna Bifstream och Bofstream Klassen Streng

Objektorienterad Programmering (TDDC77)

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

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

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

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

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

F8: Typkonvertering i C++

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

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

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

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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

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

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

F2: Krav på objektorienterat språk

Polymorfi. Objektorienterad och komponentbaserad programmering

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

1 Egna klasser. 1.1 En punkt-klass

Introduktion. Lagom är bäst. OO eller ej? TDP004 Objektorienterad Programmering Fö 7 Objektorienterad design, tips och råd

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

1. Klass med en dynamiskt allokerad variabel, definitionsfilen-del Klass med en dynamiskt allokerad variabel, inkluderingsfilen.

Malmö högskola 2007/2008 Teknik och samhälle

Transkript:

Dynamisk bindning och polymorfism I C++ är pekare till basklasser polymorfa, dvs de kan peka på objekt av en subklass typ Vid statisk bindning sker all bindning vid kompileringen -> Vid ett metodanrop är det den polymorfa pekarens typ som avgör vilken metod som avses Vid dynamisk bindning sker bindningen inte förrän programmet körs -> Vid ett metodanrop är det typen på det pekaren pekar på som avgör vilken metod som avses 112 Virtuella funktioner Statisk bindning är default - nyckelordet virtual används för att få dynamisk bindning virtual double getarea(); class Rect : public Figur double b,h; double getarea() return b*h; // virtuell 113 Virtuella anrop med pekare class Circ: public figur double r; double getarea() return 3.14*r*r; Figur *fp[2]; fp[0]=new Circ(5) fp[1]= new Rect(3,4); for(int i=0;i<2;i++) cout << Area << fp->getarea(); 114 Virtuella anrop med referens void skrivutarea(figur& f) cout << Arean är << f.getarea() <<. ; Cirk jorden(40000000/m_pi/2); skrivutarea(jorden); Referensanrop behåller datat 115 Virtuell destruktor Basklasssens destruktor anropas for (int i=0;i<2;i++) delete fp[i]; // Frigör bara en figur Aktuella klassens destruktor anropas om den är virtuell virtual ~Figur(); Frigörs ej 116 Abstrakt basklass Fångar gemensamma egenskaper Påtvingar ett gränssnitt Går ej skapa objekt från Med äkta (pure) virtuell funktion: virtual double getarea() = 0; Eller med protected konstruktor 117 1

Konstruktorer, destruktorer Hur skapar man objekt, och vad händer då Allt som skapas måste tas bort Överlagrade metoder Initiering med konstruktorer Destruktorer Initieringskonstruktor This-pekaren Konstruktorer Samma namn som klassen Ingen returtyp Ofta överlagrade Anropas av new, och vid allokering av automatiska variabler Kan misslyckas 118 119 En metod som alla andra Bil() 120 Konstruktorn anropas när objekt skapas Kan ta argument Bil b; //Default Bil b(10); Bil *b = new Bil(50); Bil *b = new Bil[50]; //Obs skillnaden Bil *b = new Bil[50](10); //Går ej! Finns ingen konstruktor anropas en default constructor, som inte gör någonting 121 Överlagrad konstruktor Initiering på kortform Bil() //Default Bil(int hast) // med argument hastighet = hast; 122 Bil() //Default Bil(int hast) : hastighet(hast) 123 2

Statiska objekt Dvs globala objekt Garanterat initierade före main startar Ordningen ej förutsägbar -> problem! Ett objekt kanske behövs av konstruktorn i ett annat, men är inte skapat ännu #include Bil.h #include Passagerare.h Bil b; Passagerare p; void main Defaultvärden Kan användas av alla metoder Vanligt vid konstruktorer Bil(int hast = 0) hastighet =hast; Bil b; -> ger hastighet = 0 Bil b(12); -> ger hastighet = 12 124 125 Återanvändning? En konstruktor kan i princip anropa en annan, men det kan leda till problem Bättre att låta defaultkonstruktorns arbete utföras av en annan metod På så sätt kan alla konstruktorer dela på metoden 126 Konstruktorer och arv En konstruktor i en subklass kan anropa basklassens konstruktor class Fordon Fordon(int hast) : hastighet (hast : public Fordon Bil(int hast = 0) : Fordon(hast) cout << hastighet << hast; 127 Vi använder new, sen då? Destruktorer Hur deallokera objekten? ->Explicit Problem men dangling pointers C++ har delete -> Implicit Vi behöver Garbage Collection i någon form Java har GC Anropas när ett objekt tas bort Antingen med delete Eller automatisk deallokering av lokala variabler Samma namn som konstruktorn men med ett tilde (~) framför Inte lika mycket använda som konstruktorer, men en god regel är att alltid ha med en! 128 129 3

Bil(int hast = 0); ~Bil() Bil::Bil(int hast) hastighet=hast; Bil::~Bil() Destruktorer forts. Alla metoder i klassen måste ha en implementation, även om den är tom Vill man inte skriva en tom konstruktor så utelämna deklarationen -> default delete används för att ta bort ett objekt som allokerats med new Använd utskrifter i konstruktorer/destruktorer under utvecklingen! 130 131 #include Fordon.h #include Bil.h int main() Bil b; // konstr b Bil *p= new Bil(10); // konstr *p delete p; // destr *p // destr b 132 Virtuell destruktor Har att göra med dynamisk bindning Gör att rätt destruktor anropas class Fordon Fordon(int hast) : hastighet(hast) virtual ~Fordon(); : public Fordon Bil(): Fordon (0) Bil(int hast) : Fordon(hast) virtual ~Bil(); 133 En sorts konstruktor till Initieringskonstruktorn Initieringskonstruktor (Copy constructor) Anropas när en kopia av ett givet objekt skall göras Kan anropas utan att du vet om det tex vid metodanrop Om djup kopiering krävs är en initieringskonstruktor ett måste Använd i fyra fall: V b=a; - Initiering av objekt från annat void fkn(v b) fkn(a); -Parameteröverföring V fkn() V t; return t; - init av returvärde d=a+b*c; - kompilatorn skapar temporär t=b*c 134 135 4

Forts. char *namn; Bil () namn=0; Bil (char *n) namn = new char[strlen(n)+1]; strcpy(namn,n); Bil (Bil &b) namn = new char[strlen(b.namn)+1]; strcpy(namn,b.namn); virtual ~Bil () delete [] namn; 136 Obs initiering <> tilldelning! int main() Bil b( bmv ); Bil kopia(b); //initiering Bil c=b; //Initiering funk(b); c = b; return 0; // kan bli init //tilldelning 137 Problem Har en klass en konstruktor som bara tar en parameter -> Automatisk konvertering från typen på parametern till klasstypen Lösning explicit : class V V(int v) void vprint(v thev) vprint(1) //Automatisk konv av 1 till V 138 This-pekaren Använd om man behöver en pekare till det objekt som metoden körs i Alla klassmetoder har en this-pekare som osynligt argument Statiska metoder har ingen this-pekare Bil (int hastighet) this -> hastighet = hastighet; 139 5