 C++ heeft een inheritance mechanisme  Manier om functionaliteit te ‘erfen’ van een parrent class ◦ Polymorphisme ◦ Zoals we het ook in C# kennen.

Slides:



Advertisements
Verwante presentaties

Advertisements

Instructie Programmeren Task 1 5JJ70. Task 1.1: Hello World •Klik naast de laatste accolade in de grijze kantlijn om een breakpoint neer te zetten, anders.
Instructie Programmeren Task 8 5JJ70. PAGE 2 Task 8: Double Linked List Het doel van deze opdracht is: Het opbouwen van een tweetal klassen, die samen.
Van domeinklasse tot implementatie
Het ontwerpen van een klasse
Klassen en objecten.
Omgevingen zijn dan geïmplementeerd als Symbol Tables. Symbol Table mapt een symbool met een Binding Meerdere noties van binding –Meerdere manieren te.
Instructie Programmeren Task 1 5JJ70. Task 1.1: Hello World Klik naast de laatste accolade in de grijze kantlijn om een breakpoint neer te zetten, anders.
Instructie Programmeren Debuggen 5JJ70. Debuggen: Wat is het probleem Je programma compileert, maar werkt niet zoals verwacht, wat nu? Vraag je af: wat.
Hoofdstuk 2 Hallo, C# !.
Inleidend probleem Data structuur (hiërarchie van classes)
Static Keyword static voor functieleden functie niet voor een object aangeroepen class K {... static int minimum( int i, int j); } aanroep: K::minimum(
JAVA -- H51 CONSTRUCTOR –- COPY-CONSTRUCTOR 1Constructor: Dezelfde naam als de klasse Wordt uitgevoerd d.m.v. new Initialisatie van de (private) attributen.
PHP functies.
Algoritmiek Object-georiënteerd Programmeren
1 Datastructuren Introductie tot de programmeeropgaven in C++ Jan van Rijn
Hogeschool HZ Zeeland 19 augustus 2003augustus 2003 Data Structuren & Algoritmen Week 3.
P. 1 Vakgroep Informatietechnologie Structuur Deel II C++ Classes Namespaces Type casting Reference types Constructors en Destructors Memory Management.
P. 1 Deel I: Programmeertaal C 4. Functies en Macro’s Prof.Dr.Ir. Filip De Turck.
Opgave 1a: void nvoid staat in de header van een methode die geen resultaatwaarde heeft nde aanroep van een void-methode is dan een opdracht i.p.v. een.
Herhaling Java-programmatie en geautomatiseerd testen (vervolg)
Visual Basic 2005/2008 OOP in praktijk André Obelink - MCSD, MVP Web: Web: -
C++ C++ als een verbetering van C Abstracte datatypen met classes Constructoren en destructoren Subklassen binding van functies 1.
Overerving: It’s a kind of magic…. Principes van OO: 1) Overerving 2) Encapsulatie 3) Polymorphisme = (deel van het) OO. paradigma.
Tircms03-p les 6 Templates. Functietemplates void verwissel(int &x, int &y); { int w=x;x=y;y=w;} Dezelfde functie voor meerdere types heet een functietemplate.
Constructoren Genesis 1:1 Aarde a1 = new Aarde(“Adam”, “Eva”);
Tircms02-p les 3 Functies Strings Structuren. Functies 1. main() 2. { int k; k = 10 ; printf(“%d\n”,fac(k)); } 3. int fac(n) int n; 4. { int f; f= 1;
Tircms03-p les 4 Klassen. Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1; } void push(stack *s,
Scope. Scope van variaben/methoden Een variabele is te gebruiken binnen de { en } waarbinnen hij is aangemaakt. Hetzelfde geld voor een methode { int.
Polymorphisme en Interfaces: inleiding
Java Objectgeoriënteerd Programmeren in Java met BlueJ
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 7 Polymorfie en overerving © 2014, Gertjan Laan, versie 2.
De laatste essentiele dingen.  Classes ◦ Syntax ◦ Constructors & Destructors  Header & Source Files ◦ Waar gebruiken we dit voor  Compiler Theorie.
Studiehouding Ergens verstand van krijgen kost tijd… Uren die je alleen in je boeken doorbrengt maken het verschil. Er is niets mis met onafhankelijkheid.
Aangepaste timing nTheorie (16 colleges + 2 deeltentamens) nPraktijk (16 keer, 3 inleveropdrachten) college Tent. 1 Tent. 3 college prakt. 1 prakt. 3 prakt.
Herhaling: He who does not learn from history, is doomed to repeat it.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
GUI & classes Een Gui in een class steken en het object gebruiken.
De definitie van een object. Een object is een verzameling van eigenschappen en bewerkingen. Veel voorkomende objecten zijn: D (display) Gui (user interface)
Pointers, arrays & dynamische geheugen
Gameprogrammeren: Objecten en geheugen
Gameprogrammeren: Game Assets
Gameprogrammeren: Lists en interfaces
Gameprogrammeren: Overerving
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Gameprogrammeren: Methoden
Gameprogrammeren: Overerving in Painter
Basis Gameprogrammeren
Tinpro015b-les3 Hfdst 3,4 Meer operatoren Functies.
C++ • C++ als een verbetering van C • Abstracte datatypen met classes • Constructoren en destructoren • Subklassen • binding van functies 1.
Gameprogrammeren: Properties
Tinpro015b-les6 Templates.
Gameprogrammeren: Game Basics
Tinpro015b-les4 Klassen.
Gameprogrammeren: Abstracte klassen
Gameprogrammeren: Interfaces
Arjan Egges Paul Bergervoet Wouter van Toll
Unified Modeling Language
Gameprogrammeren: Klassen en objecten
Arjan Egges & Paul Bergervoet
Implementatie Zoekboom
Object Communication (Jewel Jam)
ASP.NET MVC Web Development
Software Development fundamentals
Software Development fundamentals
Software Development fundamentals
Software Development fundamentals
Software Development fundamentals
Software Development fundamentals
Gameprogrammeren: Arrays
Transcript van de presentatie:

 C++ heeft een inheritance mechanisme  Manier om functionaliteit te ‘erfen’ van een parrent class ◦ Polymorphisme ◦ Zoals we het ook in C# kennen

class A { public: void doeDing() { cout<<"Ding!"<<endl; } }; class B : public A { };

int main() { A a; B b; a.doeDing(); b.doeDing(); return 0; } Output: Ding!

 Net als in C# kunnen we functies uit de base class overriden  Hiervoor moet een function in de base class met virtual aangeduid worden

class A { public: virtual void doeDing() { cout<<"Ding!"<<endl; } }; class B : public A { public: void doeDing() { cout<<“Nog Een Ding!"<<endl; } };

int main() { A a; B b; a.doeDing(); b.doeDing(); return 0; } Output: Ding! Nog Een Ding!

 Let op bij overloading!  Stel we overriden maar 1 variant van een virtual overloaded function: class A { public: virtual void doeDing() { cout<<"Ding!"<<endl;} virtual void doeDing(char* a) { cout<<a<<endl;} }; class B : public A { public: void doeDing() {cout<<"Dang!"<<endl;} };

 En nu proberen we een string argument mee te geven bij een B object B b; b.doeDing("Bam!"); error C2660: 'B::doeDing' : function does not take 1 arguments

 Voeg daarom expliciet de overloads toe aan je nieuwe class! class A { public: virtual void doeDing() { cout<<"Ding!"<<endl;} virtual void doeDing(char* a) { cout<<a<<endl;} }; class B : public A { public: void doeDing() {cout<<"Dang!"<<endl;} using A::doeDing; };

 In C# kunnen zouden we een B object ook kunnen zien als een object met type A, maar... int main() { A a = B(); a.doeDing(); return 0; } Output: Ding!

 Waarom krijgen we nu als output “Ding!” en niet “Nog Een Ding!” ?  Alles in de variable ‘a’ wordt geinterpreteerd als een object van type ‘A’ ◦ Dit betekend dus ook dat we alle functies van A krijgen!  Hoe lossen we dit op?

 Bij polymorpishe objecten moeten we ‘indirect’ onze objecten benaderen om het gewenste gedrag te krijgen  Dit lossen we op met pointers! ◦ Bij het dereferencen van de pointer wordt de juiste function pointer opgezocht

Output: Nog Een Ding! int main() { A *a = &B(); a->doeDing(); return 0; }

 Stel we willen functies van de parent class ◦ Scope operator! class A { public: virtual void doeDing() { cout<<"Ding!"<<endl; } }; class B : public A { public: void doeDing() { A::doeDing(); } };

 De constructor van de parent wordt automatisch aangeroepen ◦ (Voor de constructor van de Child) class A { public: A() { cout<<"ctor A"<<endl; } }; class B : public A { public: B() { cout<<"ctor B"<<endl; } }; B b; Output: ctor A ctor B

 Als er geen default constructor is, hoe komen we dan aan de argumenten? ◦ Child constructor moet parent constructor aanroepen met correcte argumenten! class A { public: A(char *a) { cout<<a<<endl; } }; class B : public A { public: B() : A("bam!") { } }; B b; Output: bam!

 Als we een B aanmaken, wordt ook het A deel aangemaakt: dit deel moet ook weer verwijderd worden! ◦ Automagisch.. class A { public: ~A() { cout<<"dtor A"<<endl; } }; class B : public A { public: ~B() { cout<<"dtor B"<<endl; } }; { B b; } Output: dtor B dtor A

 Maar als we B als een A zien, gaat dat niet zo automagisch! Output: dtor A int main() { A *a = new B(); delete a; return 0; }

 Heel belangrijk: Maak ook je destructor virtual! class A { public: virtual ~A() { cout<<"dtor A"<<endl; }}; class B : public A { public: ~B() { cout<<"dtor B"<<endl; } }; A *a = new B(); delete a; Output: dtor B dtor A

 Ook in C++ hebben we abstract classes  Een class is abstract als tenminste één methode een pure virtual fuction is ◦ Virtual met een twist!  Net als in C# kunnen we abstracte classes niet instancieren

 Een virtual function zonder implementatie (expliciet!) ◦ Een child class moet de virtual function implementeren, anders is ook de child abstract class A { public: virtual void doeDing() = 0; }; class B : public A { public: void doeDing() {... } };

 We kunnen geen objecten van een abstracte class instancieren  We kunnen wel het pointer type van de class gebruiken om naar child types te wijzen A *a = new B();

 Denk eraan, in C++ is alles pass-by-value! ◦ Stel, we maken een vector aan ◦ Binnen de vector wordt ruimte gemaakt voor A objecten ◦ Stel dat we nu een B object in deze vector gooien ◦ Stel nu ook dat B meer data bevat dan A (bijvoorbeeld extra member variables) ◦ Alleen sizeof(A) aan data word opgeslagen! Het B object word ergens afgekapt (Slicing) !

 Om Slicing op te lossen moeten we dus de variable loskoppelen van de grootte van het object  Pointers! ◦ In het vorige voorbeeld hadden we dus een vector moeten gebruiken

 Polymorphisme werkt hand in hand met pointers  Bij het aanmaken van een polymorpisch object wordt ook de zogenaamde ‘virtual table’ aangemaakt  De ‘virtual table’ bevat de pointers naar de correcte functions  Als een methode wordt aangeroepen wordt de correcte functie uit de ‘virtual table’ opgehaald