logo

Rene virtuelle funktioner og abstrakte klasser i C++

Nogle gange kan implementering af alle funktioner ikke leveres i en basisklasse, fordi vi ikke kender implementeringen. Sådan en klasse kaldes en abstrakt klasse . Lad for eksempel Shape være en basisklasse. Vi kan ikke levere implementeringen af ​​funktionen draw() i Shape, men vi ved, at hver afledt klasse skal have en implementering af draw(). På samme måde har en dyreklasse ikke implementeringen af ​​move() (forudsat at alle dyr bevæger sig), men alle dyr skal vide, hvordan de bevæger sig. Vi kan ikke skabe objekter af abstrakte klasser.

EN ren virtuel funktion (eller abstrakt funktion) i C++ er en virtuel funktion, som vi kan have en implementering til, men vi skal tilsidesætte den funktion i den afledte klasse, ellers vil den afledte klasse også blive en abstrakt klasse. En ren virtuel funktion erklæres ved at tildele 0 i erklæringen.



Eksempel på rene virtuelle funktioner

C++






// An abstract class> class> Test {> >// Data members of class> public>:> >// Pure Virtual Function> >virtual> void> show() = 0;> >/* Other members */> };>



>

struktur i datastruktur

>

Komplet eksempel

En ren virtuel funktion implementeres af klasser, der er afledt af 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;> }>

spil pigeon android
>

>

Produktion

fun() called>

Nogle interessante fakta

1. En klasse er abstrakt, hvis den har mindst én ren virtuel funktion.

Eksempel

I nedenstående C++-kode er Test en abstrakt klasse, fordi den har en ren virtuel funktion 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;> }>

>

>

Produktion

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 have pointere og referencer af 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;> }>

gør shell-script eksekverbart
>

>

Produktion

dhanashree verma
In Derived>

3. Hvis vi ikke tilsidesætter den rene virtuelle funktion i den afledte klasse, så bliver den afledte klasse 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;> }>

>

>

Produktion

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 have konstruktører.

For eksempel kompilerer og kører følgende program 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->sjov();> >return> 0;> }>

>

>

Produktion

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 hjælp af struct nøgleordet.

Eksempel

python tuple sorteret
struct shapeClass { virtual void Draw()=0; }>

Sammenligning med Java

I Java kan en klasse gøres abstrakt ved at bruge et abstrakt nøgleord. På samme måde kan en funktion gøres til ren virtuel eller abstrakt ved at bruge et abstrakt nøgleord. Se Abstrakte klasser i Java for flere detaljer.

Interface vs abstrakte klasser

En grænseflade har ikke en implementering af nogen af ​​dens metoder, den kan betragtes som en samling af metodeerklæringer. I C++ kan en grænseflade simuleres ved at gøre alle metoder til rene virtuelle. I Java er der et separat nøgleord til grænsefladen.

Vi kan tænke på Interface som header-filer i C++, ligesom vi i header-filer kun leverer kroppen af ​​den klasse, der skal implementere den. På samme måde i Java i Interface leverer vi kun klassens krop, og vi skriver den faktiske kode i den klasse, der implementerer den.