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



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

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

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

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

Dynamisk bindning och polymorfism

Introduktion till arv

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

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

Klasshierarkier - repetition

Arv bakgrund (kap. 9)

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

5 Arv och dynamisk bindning FIGUR

TDDC76 Programmering och datastrukturer

TDDC76 - Programmering och Datastrukturer

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

TDDC76 - Programmering och Datastrukturer

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

TDIU01 Programmering i C++

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

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

Konstruktion av klasser med klasser

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

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

OOP Objekt-orienterad programmering

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

allokeras på stacken dynamiskt new delete

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

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Klasshierarkier. Klasser kan byggas på redan definierade klasser

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

Programsystemkonstruktion med C++

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

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

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

Arv. Objektorienterad och komponentbaserad programmering

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

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

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

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

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

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

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

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

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

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

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

1 Namnkontroll (NameControl)

OOP Objekt-orienterad programmering

Föreläsning 13 Innehåll

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

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

Skapa, kopiera och destruera klassobjekt

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

Polymorfi. Objektorienterad och komponentbaserad programmering

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

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

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

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

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

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

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

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

Generiska konstruktioner. Kursbokens kapitel 13

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

Imperativ programmering. Föreläsning 4

1 Klasser och objektorientering Vad är objektorientering?

Innehåll. Pekare Exempel

DAT043 - Föreläsning 7

ÖREBRO UNIVERSITET. Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Tentamen EDAF30 Programmering i C++

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

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

OOP Objekt-orienterad programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, 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.

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

Classes och Interfaces, Objects och References, Initialization

Innehåll. Pekare Exempel

F8: Typkonvertering i C++

Objektorientering - Arv och polymorfi

Kapitel 6 - Undantag

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

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

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

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

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

Tillämpad programmering

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

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

Högskolan Dalarna sid 1 av 5 Data-sektionen Hans-Edy Mårtensson

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

C++ Objektorientering - Klasser. Eric Elfving

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

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Tillämpad programmering

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

TDDC76 - Programmering och Datastrukturer

Transkript:

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

Arv Innehåll Härledda klasser Konstruktorer och destruktorer vid arv Tillgänglighet Polymorfism och dynamisk bindning Abstrakta klasser Multipel ärvning Jämförelser med Java EDA623 (Föreläsning 6) HT 2013 2 / 42

Härledda klasser Grafisk representation Relationen är (generalisering) Basklass (superklass) Person Härledd klass (subklass) Anstalld EDA623 (Föreläsning 6) HT 2013 3 / 42

Härledda klasser Basklassens deklaration #include <string> class Person { public: Person() {} const std::string& heter() const {return namn;} void andra_namn(const std::string& n); void skriv_info() const; private: std::string namn; }; EDA623 (Föreläsning 6) HT 2013 4 / 42

Härledda klasser Basklassens medlemsfunktioner #include <iostream> using namespace std; void Person::andra_namn(const std::string& n) { namn = n; } void Person::skriv_info() const { cout << "Namn : " << namn << endl; } EDA623 (Föreläsning 6) HT 2013 5 / 42

Härledda klasser Deklaration av härledd klass class Anstalld : public Person { public: Anstalld() : lon(0) {} long tjanar() const {return lon;} void andra_lon(long ny_lon); void skriv_info() const; private: long lon; }; EDA623 (Föreläsning 6) HT 2013 6 / 42

Härledda klasser Härledda klassens medlemsfunktioner void Anstalld::andra_lon(long ny_lon) { lon = ny_lon; } // Modifierad skriv_info // (döljer basklassens skriv_info) void Anstalld::skriv_info() const { Person::skriv_info(); // basklassens info cout << "Lön : " << lon << endl; } EDA623 (Föreläsning 6) HT 2013 7 / 42

Härledda klasser Skapande och hanterande av objekt Person p; Anstalld a; p.andra_namn("kalle Olsson"); p.skriv_info(); a.andra_namn("nisse Nilsson"); a.andra_lon(23000); long l = a.tjanar(); a.skriv_info(); EDA623 (Föreläsning 6) HT 2013 8 / 42

Härledda klasser Utskrift Namn: Kalle Olsson Namn: Nisse Nilsson Lön: 23000 EDA623 (Föreläsning 6) HT 2013 9 / 42

Härledda klasser Funktionsöverlagring fungerar ej mellan olika nivåer i arvshierarkin class C1 { public: void f(int); // C1::f }; class C2 : public C1 { public: 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! EDA623 (Föreläsning 6) HT 2013 10 / 42

Härledda klasser Grafisk representation Arv i flera nivåer Person Anstalld Härledd klass till Anstalld Programmerare EDA623 (Föreläsning 6) HT 2013 11 / 42

Härledda klasser Arv i flera nivåer Klassdefinition class Programmerare : public Anstalld { public: Programmerare() {fav[0]= \0 ;} // Programmerare() {} const std::string avlas_favorit() const; // const std::string& avlas_favorit() const; void andra_favorit(const std::string& f); void skriv_info() const; private: char fav[20]; // Favoritspråk // Typen vald för att passa // i senare exempel // std::string fav; // Favoritspråk }; EDA623 (Föreläsning 6) HT 2013 12 / 42

Härledda klasser Definitioner av medlemsfunktioner const std::string Programmerare::avlas_favorit() const { return fav; } // Kan inte returnera referens här! //const std::string& Programmerare::avlas_favorit() const { // return fav; //} void Programmerare::andra_favorit(const std::string& f) { strcpy(fav, f.c_str()); } //void Programmerare::andra_favorit(const std::string& f) { // fav = f; //} void Programmerare::skriv_info () const { Anstalld::skriv_info(); cout << "Favorit: " << fav << endl; }EDA623 (Föreläsning 6) HT 2013 13 / 42

Härledda klasser Användning Programmerare pr, *pp; pr.andra_namn("lasse Olsson"); pr.andra_lon(22000); pr.andra_favorit("visual Basic"); pr.skriv_info(); // Anstalld::skriv_info() pp = new Programmerare; pp->andra_namn("anna Nilsson"); pp->andra_lon(25000); pp->andra_favorit("c++"); pp->skriv_info(); EDA623 (Föreläsning 6) HT 2013 14 / 42

Härledda klasser Utskrift Namn : Lasse Olsson Lön : 22000 Favorit: Visual Basic Namn : Anna Nilsson Lön : 25000 Favorit: C++ EDA623 (Föreläsning 6) HT 2013 15 / 42

Härledda klasser Grafisk representation Parallella subklasser Person namn Anstalld namn lon Programmerare namn lon fav TillfAnstalld namn lon fran, till EDA623 (Föreläsning 6) HT 2013 16 / 42

Härledda klasser Arv i flera nivåer Klassdefinition class Datum { public: int ar, man, dag; }; class TillfAnstalld : public Anstalld { public: Datum fran, till; }; EDA623 (Föreläsning 6) HT 2013 17 / 42

Härledda klasser Användning //... Programmerare pr, *pp = &pr; TillfAnstalld ti; Anstalld *pa; pa = pp; // OK (basklass <-- subklass) pp = (Programmerare *)pa; // Kan gå bra pa = &ti; // OK (basklass <-- subklass) pp = (Programmerare *)pa; // Kan gå illa pp->andra_favorit("java"); // Inte bra! pp->skriv_info(); // Ser ut att funka? ti.fran.ar = 1999; pp->skriv_info(); // Vart tog Java vägen? EDA623 (Föreläsning 6) HT 2013 18 / 42

Konstruktorer vid arv Initieringsordning i en konstruktor (för härledd klass) 1 Basklassens konstruktor anropas 2 Datamedlemmar (i den egna klassen) initieras 3 Funktionskroppen i konstruktorn exekveras Explicit anrop av basklassens konstruktor i initieringslistan D::D(param.) : B(param.),... {...} B D EDA623 (Föreläsning 6) HT 2013 19 / 42

Konstruktorer vid arv Överlagring av konstruktorer class Person { public: Person() {} Person(const std::string& n) : namn(n) {} }; class Anstalld : public Person { public: Anstalld() : lon(0) {} // Överlagring! Anstalld(const std::string& n, long l) : Person(n), lon(l) {}; // Överlagring! }; EDA623 (Föreläsning 6) HT 2013 20 / 42

Destruktorer vid arv Exekveringsordning i en destruktor 1 Funktionskroppen i destruktorn exekveras 2 Basklassens destruktor anropas EDA623 (Föreläsning 6) HT 2013 21 / 42

Tillgänglighet De olika nivåerna av tillgänglighet class C { public: // Medlemmar åtkomliga från godt. funktioner protected: // Medlemmar åtkomliga från medlemsfunktioner // i basklassen eller härledda klasser private: // Medlemmar åtkomliga endast från // basklassens medlemsfunktioner }; EDA623 (Föreläsning 6) HT 2013 22 / 42

Tillgänglighet Tillgänglighet vid arv class D : public B { // Publikt arv //... }; class D : protected B { // Skyddat arv //... }; class D : private B { // Privat arv //... }; EDA623 (Föreläsning 6) HT 2013 23 / 42

Tillgänglighet Tillgänglighet vid arv Tillgänglighet i B Tillgänglighet via D public public Publikt arv protected protected private public private protected Skyddat arv protected protected private public private private Privat arv protected private private private Tillgängligheten inuti D påverkas inte av typen av arv EDA623 (Föreläsning 6) HT 2013 24 / 42

Polymorfism och dynamisk bindning Polymorfism (mångformighet) Överlagring Generiska programenheter (templates) Virtuella funktioner Statisk bindning Statisk bindning Dynamisk bindning Statisk bindning: Dynamisk bindning: Betydelsen hos en viss konstruktion avgörs vid kompilering Betydelsen hos en viss konstruktion avgörs vid exekvering EDA623 (Föreläsning 6) HT 2013 25 / 42

Polymorfism och dynamisk bindning Dynamisk bindning av en funktion (virtuell funktion) markeras med nyckelordet virtual före funktionsnamnet i funktionsdeklarationen class Fordon { public: virtual void ge_info(); }; Klass med minst en virtuell funktion kallas för en virtuell klass EDA623 (Föreläsning 6) HT 2013 26 / 42

Polymorfism och dynamisk bindning Grafisk representation Klasser av fordon Fordon Motorfordon Lastbil Personbil Buss EDA623 (Föreläsning 6) HT 2013 27 / 42

Polymorfism och dynamisk bindning Klasser av fordon class Fordon { public: virtual void ge_info(); }; class Motorfordon : public Fordon { public: Motorfordon(const std::string& nr) : reg_num(nr) {} const std::string& nummer() const {return reg_num;} void ge_info(); protected: std::string reg_num; }; EDA623 (Föreläsning 6) HT 2013 28 / 42

Polymorfism och dynamisk bindning Klasser av fordon class Personbil : public Motorfordon { public: Personbil(const std::string&nr, int n) : Motorfordon(nr), platser(n) {} void ge_info(); protected: int platser; }; EDA623 (Föreläsning 6) HT 2013 29 / 42

Polymorfism och dynamisk bindning Klasser av fordon class Lastbil : public Motorfordon { public: Lastbil(const std::string& nr, int l) : Motorfordon(nr), max_last(l) {} void ge_info(); protected: int max_last; }; EDA623 (Föreläsning 6) HT 2013 30 / 42

Polymorfism och dynamisk bindning Klasser av fordon class Buss : public Motorfordon { public: Buss(const std::string& nr, int n, bool l=false) : Motorfordon(nr), passag(n), luftk(l) {} void ge_info(); protected: int passag; bool luftk; }; EDA623 (Föreläsning 6) HT 2013 31 / 42

Polymorfism och dynamisk bindning Def. av ge_info för olika klasser void Fordon::ge_info() { cout << "Ett fordon" << endl; } void Motorfordon::ge_info() { cout << "Ett motorfordon" << endl; cout << "Reg nr: " << reg_num << endl; } void Personbil::ge_info() { Motorfordon::ge_info(); cout << "En personbil" << endl; cout << platser << " platser" << endl; } EDA623 (Föreläsning 6) HT 2013 32 / 42

Polymorfism och dynamisk bindning Def. av ge_info för olika klasser void Lastbil::ge_info() { Motorfordon::ge_info(); cout << "En lastbil" << endl; cout << "Max last (kg): " << max_last <<endl; } void Buss::ge_info() { Motorfordon::ge_info(); cout << "En buss" << endl; cout << passag << " passagerare" <<endl; if (luftk) cout << "Har luftkonditionering" <<endl; } EDA623 (Föreläsning 6) HT 2013 33 / 42

Polymorfism och dynamisk bindning Skapande av objekt Personbil pb("xyz 555", 5); Lastbil lb("zzz 222", 10000); Buss b("cpp 999", 60); Fordon *fp; pb.ge_info(); fp = &lb; fp->ge_info(); fp = new Personbil("AAA 333", 4); fp->ge_info(); fp = &b; // Oops, glömde delete fp fp->ge_info(); EDA623 (Föreläsning 6) HT 2013 34 / 42

Polymorfism och dynamisk bindning Utskrifter Ett motorfordon Reg nr: XYZ 555 En personbil 5 platser Ett motorfordon Reg nr: ZZZ 222 En lastbil Max last (kg): 10000 Ett motorfordon Reg nr: AAA 333 En personbil 4 platser Ett motorfordon Reg nr: CPP 999 En buss 60 passagerare EDA623 (Föreläsning 6) HT 2013 35 / 42

Operatorn typeid Avgörande av dynamisk typ med typeid // fp är statiskt av typ Fordon* if (typeid(*fp) == typeid(personbil)) cout << "Fordonet är en personbil"; else if (typeid(*fp) == typeid(lastbil)) cout << "Fordonet är en lastbil"; else if (typeid(*fp) == typeid(buss)) cout << "Fordonet är en buss"; EDA623 (Föreläsning 6) HT 2013 36 / 42

Operatorn dynamic_cast Säker dynamisk typkonvertering med dynamic_cast // fp är även i detta exempel statiskt av typ Fordon* Motorfordon *mp; if (mp = dynamic_cast<motorfordon *>(fp)) cout << mp->nummer() << endl; // Alternativt sätt via typeid: if (typeid(fp)==typeid(motorfordon)) { mp = (Motorfordon *) fp; cout << mp->nummer() << endl; } EDA623 (Föreläsning 6) HT 2013 37 / 42

Virtuella destruktorer Om en härledd klass introducerar någon ny dynamisk struktur internt så måste en virtuell destruktor användas i denna klass Exempel: Virtuell destruktor class D : public B { public: D() {s = new char [80];} virtual ~D() {delete []s;} private: char *s; }; Utan virtual ovan deallokeras inte s här: B* d = new D;... delete d; EDA623 (Föreläsning 6) HT 2013 38 / 42

Abstrakta klasser Medlemsfunktion utan implementering (def.) deklareras som rent virtuell funktion genom initiering till 0 Exempel: Abstrakt klass class Fordon { public: virtual void ge_info()=0; //... }; Används som markör i en basklass för att garantera att funktionen finns med i härledda klasser EDA623 (Föreläsning 6) HT 2013 39 / 42

Abstrakta klasser En klass med minst en rent virtuell funktion kallas en abstrakt klass Inga objekt kan skapas från en abstrakt klass Härledda klasser utan egna versioner av varje rent virtuell funktion blir också abstrakta EDA623 (Föreläsning 6) HT 2013 40 / 42

Multipel ärvning I C++ kan en klass ha flera basklasser Detta kallas för multipelt arv Exempel: Multipelt arv class Bat : public Fordon {//...}; class Motorbat : public Bat {//...}; class Amfibiebil : public Motorbat, public Personbil {//...}; Om basklassen har medlemsvariabler så kan man specifiera om dessa skall komma med en eller flera gånger i den härledda klassen Exempel: Virtuell basklass // Modifiering för entydighet vid ärvning class Bat : virtual public Fordon {//...}; class Motorfordon : virtual public Fordon {//...}; EDA623 (Föreläsning 6) HT 2013 41 / 42

Jämförelse med Java I Java motsvaras en rent virtuell funktion av en abstrakt metod (dekl. med abstract) Observera även att alla metoder i Java är automatiskt virtuella med C++-terminologi! I Java finns inte multipel ärvning. Istället har man infört interface vilket ungefär motsvarar en abstrakt klass med samtliga metoder abstrakta men som dessutom helt saknar attribut EDA623 (Föreläsning 6) HT 2013 42 / 42