C++ Polymorfisme Uitgelegd: Praktische Voorbeelden & Kernconcepten
Wat is Polymorfisme in C++?
In C++ zorgt polymorfisme ervoor dat een member‑functie zich anders gedraagt, gebaseerd op het object dat het aanroept. Polymorfisme is een Griekse term die "vele vormen hebben" betekent. Het treedt op wanneer je een hiërarchie van klassen hebt die gerelateerd zijn via inheritance.
Bijvoorbeeld, stel we hebben de functie makeSound(). Als een kat deze functie aanroept, produceert het een miauw‑geluid. Als een koe dezelfde functie aanroept, produceert het een moe‑geluid.

Hoewel we één functie hebben, gedraagt deze zich anders onder verschillende omstandigheden. De functie heeft veel vormen; dus hebben we polymorfisme bereikt.
In deze C++ tutorial leer je:
- Wat is Polymorfisme?
- Typen Polymorfisme
- Compile‑Time Polymorfisme
- Function Overloading
- Operator Overloading
- Runtime Polymorfisme
- Function Overriding
- C++ Virtual Function
- Compile‑Time vs. Run‑Time Polymorfisme
Typen Polymorfisme
C++ ondersteunt twee typen polymorfisme:
- Compile‑time polymorfisme, en
- Runtime polymorfisme.

Compile‑Time Polymorfisme
Je roept overloaded functies aan door het aantal en type argumenten te matchen. De informatie is aanwezig tijdens compile‑tijd. Dit betekent dat de C++‑compiler de juiste functie tijdens compile‑tijd selecteert.
Compile‑time polymorfisme wordt bereikt via function overloading en operator overloading.
Function Overloading
Function overloading treedt op wanneer we veel functies met gelijkaardige namen maar verschillende argumenten hebben. De argumenten kunnen verschillen in aantal of type.
Voorbeeld 1:
#include <iostream>
using namespace std;
void test(int i) {
cout << " The int is " << i << endl;
}
void test(double f) {
cout << " The float is " << f << endl;
}
void test(char const *ch) {
cout << " The char* is " << ch << endl;
}
int main() {
test(5);
test(5.5);
test("five");
return 0;
}
Output:

Hier is een screenshot van de code:

Code‑uitleg:
- Include iostream header voor functies.
- Include std naamruimte voor klassen zonder prefix.
- Creëer functie
testmet integer parameteri. - Statement voor uitvoering bij aanroep.
- Einde functie body.
- Creëer functie
testmet float parameterf. - Statement voor uitvoering bij aanroep.
- Einde functie body.
- Creëer functie
testmet character parameterch. - Statement voor uitvoering bij aanroep.
- Einde functie body.
- Roep
main()aan. - Roep
testaan met 5 – roept integer‑versie aan. - Roep
testaan met 5.5 – roept float‑versie aan. - Roep
testaan met "five" – roept char*‑versie aan. - Programma retourneert waarde bij succes.
- Einde
main().
We hebben drie functies met dezelfde naam maar verschillende argument‑typen. We hebben polymorfisme bereikt.
Operator Overloading
Bij Operator Overloading definiëren we een nieuwe betekenis voor een C++ operator. Het verandert ook hoe de operator werkt. Bijvoorbeeld, we kunnen de + operator definiëren om twee strings te concateneren. We kennen het als opteloperator voor numerieke waarden. Na onze definitie, wanneer tussen integers geplaatst, voegt het ze toe. Wanneer tussen strings geplaatst, concateneert het ze.
Voorbeeld 2:
#include<iostream>
using namespace std;
class ComplexNum {
private:
int real, over;
public:
ComplexNum(int rl = 0, int ov = 0) {
real = rl;
over = ov;
}
ComplexNum operator + (ComplexNum const &obj) {
ComplexNum result;
result.real = real + obj.real;
result.over = over + obj.over;
return result;
}
void print() {
cout << real << " + i" << over << endl;
}
};
int main() {
ComplexNum c1(10, 2), c2(3, 7);
ComplexNum c3 = c1+c2;
c3.print();
}
Output:

Hier is een screenshot van de code:


Code‑uitleg:
- Include iostream header.
- Include std naamruimte.
- Creëer klasse
ComplexNum. - Gebruik
privatevoor variabelen. - Definieer
realenoverals integers. - Gebruik
publicvoor constructor. - Creëer constructor en initialiseer variabelen.
- Initialiseer
real. - Initialiseer
over. - Einde constructor body.
- We moeten de betekenis van
+overschrijven. - Creëer datatype
resultvan typeComplexNum. - Gebruik
+met complexe getallen – reële delen optellen. - Gebruik
+met complexe getallen – imaginaire delen optellen. - Retourneer
resultbij succes. - Einde definitie nieuwe betekenis
+. - Roep
print()aan. - Print nieuw complex getal na optelling.
- Einde
print()functie. - Einde
ComplexNumclass. - Roep
main()aan. - Geef waarden voor reële en complexe delen door. Eerste deel c1 + eerste deel c2 = 10+3. Tweede deel c1 + tweede deel c2 = 2+7.
- Voer operatie uit met overloaded
+en sla op inc3. - Print waarde van
c3. - Einde
main().
Runtime Polymorfisme
Dit gebeurt wanneer een object‑methode tijdens runtime aangeroepen wordt in plaats van tijdens compile‑tijd. Runtime polymorfisme wordt bereikt via function overriding. De aan te roepen functie wordt tijdens runtime vastgelegd.
Function Overriding
Function overriding treedt op wanneer een functie van de base‑class een nieuwe definitie krijgt in een derived‑class. Op dat moment zeggen we dat de base‑functie geöverschreven is.
Bijvoorbeeld:
#include <iostream>
using namespace std;
class Mammal {
public:
void eat() {
cout << "Mammals eat...";
}
};
class Cow: public Mammal {
public:
void eat() {
cout << "Cows eat grass...";
}
};
int main(void) {
Cow c = Cow();
c.eat();
return 0;
}
Output:

Hier is een screenshot van de code:

Code‑uitleg:
- Importeer iostream header.
- Include std naamruimte.
- Creëer klasse
Mammal. - Gebruik
publicvoor de functie. - Creëer publieke functie
eat. - Print statement bij aanroep
eat(). - Einde
eat()body. - Einde
Mammalclass. - Creëer klasse
CowdieMammalerft.Cowis derived,Mammalis base. - Gebruik
publicvoor functie. - Overschrijf
eat()uit base‑class. - Statement om te printen bij aanroep.
- Einde
eat()body. - Einde
Cowclass. - Roep
main()aan. - Creëer instantie
Cowmet naamc. - Roep
eat()aan gedefinieerd inCow. - Programma retourneert waarde bij succes.
- Einde
main().
C++ Virtual Function
Een virtual function is een andere manier om run‑time polymorfisme in C++ te implementeren. Het is een speciale functie gedefinieerd in een base‑class en hergedefinieerd in de derived‑class. Om een virtual function te declareren, gebruik je het virtual-keyword. Het keyword moet de declaratie van de functie in de base‑class voorafgaan.
Als een virtual function class geërfd wordt, herdefinieert de derived‑class de virtual function passend bij zijn behoeften. Bijvoorbeeld:
#include <iostream>
using namespace std;
class ClassA {
public:
virtual void show() {
cout << "The show() function in base class invoked..." << endl;
}
};
class ClassB :public ClassA {
public:
void show() {
cout << "The show() function in derived class invoked...";
}
};
int main() {
ClassA* a;
ClassB b;
a = &b;
a->show();
}
Output:

Hier is een screenshot van de code:

Code‑uitleg:
- Include iostream header.
- Include std naamruimte.
- Creëer klasse
ClassA. - Gebruik
publicvoor class member. - Creëer virtual functie
show(). Publieke functie. - Tekst om te printen bij aanroep
show().endl= einde regel. - Einde
show()body. - Einde
ClassAbody. - Creëer nieuwe klasse
ClassBdieClassAerft.ClassA= base,ClassB= derived. - Gebruik
publicvoor class member. - Herdefinieer virtual functie
show()uit base‑class. - Tekst om te printen bij aanroep
show()in derived class. - Einde
show()body. - Einde
ClassBbody. - Roep
main()aan. - Creëer pointer variabele
adie wijst naarClassA. - Creëer instantie
ClassBmet naamb. - Wijs adres van
btoe aana. - Roep
show()aan gedefinieerd in derived class. Late binding geïmplementeerd. - Einde
main().
Compile‑Time Polymorfisme vs. Run‑Time Polymorfisme
Hier zijn de belangrijkste verschillen:
| Compile‑time polymorfisme | Run‑time polymorfisme |
|---|---|
| Ook wel early binding of static polymorfisme genoemd | Ook wel late/dynamic binding of dynamic polymorfisme genoemd |
| Methode wordt aangeroepen tijdens compile‑tijd | Methode wordt aangeroepen tijdens run‑time |
| Geïmplementeerd via function overloading en operator overloading | Geïmplementeerd via method overriding en virtual functions |
| Voorbeeld: method overloading. Veel methoden met gelijke namen maar verschillend aantal of types argumenten | Voorbeeld: method overriding. Veel methoden met gelijke naam en zelfde prototype |
| Snellere uitvoering omdat method discovery tijdens compile‑tijd gebeurt | Langzamere uitvoering omdat method discovery tijdens runtime gebeurt |
| Minder flexibiliteit voor probleemoplossing omdat alles tijdens compile‑tijd bekend is | Veel flexibiliteit voor complexe problemen omdat methoden tijdens runtime ontdekt worden |
Samenvatting:
- Polymorfisme betekent vele vormen hebben.
- Het treedt op wanneer er een hiërarchie van klassen is gerelateerd via inheritance.
- Met polymorfisme kan een functie zich anders gedragen gebaseerd op het object dat het aanroept.
- Bij compile‑time polymorfisme wordt de aan te roepen functie tijdens compile‑tijd vastgelegd.
- Bij runtime polymorfisme wordt de aan te roepen functie tijdens runtime vastgelegd.
- Compile‑time polymorfisme wordt bepaald door function overloading en operator overloading.
- Bij function overloading zijn er veel functies met gelijke namen maar verschillende argumenten.
- Parameters kunnen verschillen in aantal of type.
- Bij operator overloading wordt een nieuwe betekenis gedefinieerd voor C++ operators.
- Runtime polymorfisme wordt bereikt via function overriding.
- Bij function overriding geeft een derived‑class een nieuwe definitie aan een functie gedefinieerd in de base‑class.
C Taal
- Arrays doorgeven aan functies in C++: een praktische gids
- C++ Operators Uitgelegd: Typen, Voorbeelden en Voorbeeldprogramma's
- C++ Switch‑Case Onder de Knie: Syntaxis, Gebruik en Praktische Voorbeelden
- C++ Dynamische Array‑Allocatie: Praktische Handleiding met Code‑Voorbeelden
- C++ Operator Overloading – Praktische Handleiding met Code‑Voorbeelden
- C++ Structs Uitgelegd met een Praktisch Voorbeeld
- Beheersen van std::list in C++: Syntaxis, Functies & Praktische Voorbeelden
- C++ Functies Uitgelegd met Praktische Codevoorbeelden
- C++ Struct vs Class: Belangrijkste Verschillen, Syntaxis en Beste Gebruikssituaties
- calloc() in C: Nul-geïnitialiseerde geheugenallocatie en een praktisch voorbeeld
- Beheersing van C's free() functie: Praktische gids & voorbeeld