Noen ganger kan ikke implementering av alle funksjoner leveres i en basisklasse fordi vi ikke kjenner implementeringen. En slik klasse kalles en abstrakt klasse .La for eksempel Shape være en grunnklasse. Vi kan ikke gi implementeringen av funksjonen draw() i Shape, men vi vet at hver avledet klasse må ha en implementering av draw(). På samme måte har ikke en dyreklasse implementeringen av move() (forutsatt at alle dyr beveger seg), men alle dyr må vite hvordan de skal bevege seg. Vi kan ikke lage objekter av abstrakte klasser.
EN ren virtuell funksjon (eller abstrakt funksjon) i C++ er en virtuell funksjon som vi kan ha en implementering for, men vi må overstyre den funksjonen i den avledede klassen, ellers vil den avledede klassen også bli en abstrakt klasse. En ren virtuell funksjon er deklarert ved å tildele 0 i deklarasjonen.
Eksempel på rene virtuelle funksjoner
C++
// An abstract class> class> Test {> >// Data members of class> public>:> >// Pure Virtual Function> >virtual> void> show() = 0;> >/* Other members */> };> |
>
struktur i datastruktur
>
Komplett eksempel
En ren virtuell funksjon er implementert av klasser som er avledet fra en abstrakt 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;> }> |
navn på usa by
>
>Produksjon
fun() called>
Noen interessante fakta
1. En klasse er abstrakt hvis den har minst én ren virtuell funksjon.
Eksempel
I C++-koden nedenfor er Test en abstrakt klasse fordi den har en ren virtuell funksjon show().
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;> }> |
>
>
Produksjon
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. Vi kan ha pekere og referanser av abstrakt klassetype.
For eksempel fungerer følgende program fint.
C++
// 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->vis();> >return> 0;> }> |
gjør shell script kjørbart
>
>Produksjon
for loop i c
In Derived>
3. Hvis vi ikke overstyrer den rene virtuelle funksjonen i den deriverte klassen, så blir den avledede klassen også en abstrakt klasse.
Følgende eksempel viser det samme.
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;> }> |
>
>
Produksjon
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. En abstrakt klasse kan ha konstruktører.
For eksempel, følgende program kompilerer og kjører fint.
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->moro();> >return> 0;> }> |
>
>Produksjon
Constructor of base called x = 4, y = 5 Constructor of base called x = 6, y = 7>
5. En abstrakt klasse i C++ kan også defineres ved å bruke struct nøkkelord.
Eksempel
python tuppel sortert
struct shapeClass { virtual void Draw()=0; }> Sammenligning med Java
I Java kan en klasse gjøres abstrakt ved å bruke et abstrakt nøkkelord. På samme måte kan en funksjon gjøres til ren virtuell eller abstrakt ved å bruke et abstrakt nøkkelord. Se Abstrakte klasser i Java for flere detaljer.
Grensesnitt vs abstrakte klasser
Et grensesnitt har ikke en implementering av noen av metodene, det kan betraktes som en samling av metodeerklæringer. I C++ kan et grensesnitt simuleres ved å gjøre alle metoder til rene virtuelle. I Java er det et eget nøkkelord for grensesnittet.
Vi kan tenke på Interface som header-filer i C++, som i header-filer gir vi bare kroppen til klassen som skal implementere den. På samme måte i Java i grensesnitt gir vi bare kroppen til klassen, og vi skriver den faktiske koden i hvilken klasse som implementerer den.