Soms kan de implementatie van alle functies niet in een basisklasse worden geleverd, omdat we de implementatie niet kennen. Zo’n klasse heet een abstracte klasse Laat Shape bijvoorbeeld een basisklasse zijn. We kunnen de implementatie van de functie draw() in Shape niet bieden, maar we weten dat elke afgeleide klasse een implementatie van draw() moet hebben. Op dezelfde manier heeft een klasse Animal niet de implementatie van move() (ervan uitgaande dat alle dieren bewegen), maar alle dieren moeten weten hoe ze moeten bewegen. We kunnen geen objecten van abstracte klassen maken.
A puur virtuele functie (of abstracte functie) in C++ is een virtuele functie waarvoor we een implementatie kunnen hebben. Maar we moeten die functie in de afgeleide klasse overschrijven, anders wordt de afgeleide klasse ook een abstracte klasse. Een puur virtuele functie wordt gedeclareerd door 0 toe te wijzen in de declaratie.
ffilms
Voorbeeld van pure virtuele functies
C++
// An abstract class> class> Test {> >// Data members of class> public>:> >// Pure Virtual Function> >virtual> void> show() = 0;> >/* Other members */> };> |
>
>
Compleet voorbeeld
Een puur virtuele functie wordt geïmplementeerd door klassen die zijn afgeleid van een abstracte klasse.
C++
// C++ Program to illustrate the abstract class and virtual> // functions> #include> using> namespace> std;> class> Base {> >// private member variable> >int> x;> public>:> >// pure virtual function> >virtual> void> fun() = 0;> >// getter function to access x> >int> getX() {>return> x; }> };> // This class inherits from Base and implements fun()> class> Derived :>public> Base {> >// private member variable> >int> y;> public>:> >// implementation of the pure virtual function> >void> fun() { cout <<>'fun() called'>; }> };> int> main(>void>)> {> >// creating an object of Derived class> >Derived d;> >// calling the fun() function of Derived class> >d.fun();> >return> 0;> }> |
>
>Uitvoer
fun() called>
Enkele interessante feiten
1. Een klasse is abstract als deze ten minste één puur virtuele functie heeft.
Voorbeeld
In de onderstaande C++-code is Test een abstracte klasse omdat deze een pure virtuele functie show() heeft.
C++
// C++ program to illustrate the abstract class with pure> // virtual functions> #include> using> namespace> std;> class> Test {> >// private member variable> >int> x;> public>:> >// pure virtual function> >virtual> void> show() = 0;> >// getter function to access x> >int> getX() {>return> x; }> };> int> main(>void>)> {> >// Error: Cannot instantiate an abstract class> >Test t;> >return> 0;> }> |
>
>
Uitvoer
Compiler Error: cannot declare variable 't' to be of abstract type 'Test' because the following virtual functions are pure within 'Test': note: virtual void Test::show()>
2. We kunnen verwijzingen en referenties van het abstracte klassentype hebben.
Het volgende programma werkt bijvoorbeeld prima.
C++
lijst Java naar array
// C++ program that demonstrate that> // we can have pointers and references> // of abstract class type.> #include> using> namespace> std;> class> Base {> public>:> >// pure virtual function> >virtual> void> show() = 0;> };> class> Derived :>public> Base {> public>:> >// implementation of the pure virtual function> >void> show() { cout <<>'In Derived
'>; }> };> int> main(>void>)> {> >// creating a pointer of type> >// Base pointing to an object> >// of type Derived> >Base* bp =>new> Derived();> >// calling the show() function using the> >// pointer> >bp->toon();> >return> 0;> }> |
>
>Uitvoer
In Derived>
3. Als we de puur virtuele functie in de afgeleide klasse niet overschrijven, wordt de afgeleide klasse ook een abstracte klasse.
Het volgende voorbeeld laat hetzelfde zien.
C++
// C++ program to demonstrate that if we do not override> // the pure virtual function in the derived class, then> // the derived class also becomes an abstract class> #include> using> namespace> std;> class> Base {> public>:> >// pure virtual function> >virtual> void> show() = 0;> };> class> Derived :>public> Base {> };> int> main(>void>)> {> >// creating an object of Derived class> >Derived d;> >return> 0;> }> |
>
>
Uitvoer
Compiler Error: cannot declare variable 'd' to be of abstract type 'Derived' because the following virtual functions are pure within 'Derived': virtual void Base::show()>
4. Een abstracte klasse kan constructors hebben.
Het volgende programma compileert bijvoorbeeld en werkt prima.
C++
// C++ program to demonstrate that> // an abstract class can have constructors.> #include> using> namespace> std;> // An abstract class with constructor> class> Base {> protected>:> >// protected member variable> >int> x;> public>:> >// pure virtual function> >virtual> void> fun() = 0;> >// constructor of Base class> >Base(>int> i)> >{> >x = i;> >cout <<>'Constructor of base called
'>;> >}> };> class> Derived :>public> Base {> >// private member variable> >int> y;> public>:> >// calling the constructor of Base class> >Derived(>int> i,>int> j)> >: Base(i)> >{> >y = j;> >}> >// implementation of pure virtual function> >void> fun()> >{> >cout <<>'x = '> << x <<>', y = '> << y <<>'
'>;> >}> };> int> main(>void>)> {> >// creating an object of Derived class> >Derived d(4, 5);> >// calling the fun() function of Derived class> >d.fun();> >// creating an object of Derived class using> >// a pointer of the Base class> >Base* ptr =>new> Derived(6, 7);> >// calling the fun() function using the> >// pointer> >ptr->leuk();> >return> 0;> }> |
>
>Uitvoer
Constructor of base called x = 4, y = 5 Constructor of base called x = 6, y = 7>
5. Een abstracte klasse in C++ kan ook worden gedefinieerd met behulp van het trefwoord struct.
Voorbeeld
struct shapeClass { virtual void Draw()=0; }> Vergelijking met Java
In Java kan een klasse abstract worden gemaakt door een abstract trefwoord te gebruiken. Op dezelfde manier kan een functie puur virtueel of abstract worden gemaakt door een abstract trefwoord te gebruiken. Zien Abstracte klassen in Java voor meer details.
Interface versus abstracte klassen
Een interface heeft geen implementatie van een van zijn methoden, maar kan worden beschouwd als een verzameling methodedeclaraties. In C++ kan een interface worden gesimuleerd door alle methoden puur virtueel te maken. In Java is er een apart trefwoord voor de interface.
We kunnen Interface zien als headerbestanden in C++, net zoals we in headerbestanden alleen de hoofdtekst van de klasse leveren die het gaat implementeren. Op dezelfde manier leveren we in Java in Interface alleen de hoofdtekst van de klasse en schrijven we de daadwerkelijke code in welke klasse deze ook implementeert.