Kartais visų funkcijų įgyvendinimas negali būti pateiktas bazinėje klasėje, nes mes nežinome, kaip įgyvendinti. Tokia klasė vadinama an abstrakti klasė .Pavyzdžiui, leiskite Shape būti bazine klase. Negalime pateikti funkcijos draw() įgyvendinimo Shape, bet žinome, kad kiekviena išvestinė klasė turi turėti draw(). Panašiai gyvūnų klasėje nėra „move()“ įgyvendinimo (darant prielaidą, kad visi gyvūnai juda), tačiau visi gyvūnai turi žinoti, kaip judėti. Negalime kurti abstrakčių klasių objektų.
A gryna virtuali funkcija (arba abstrakčioji funkcija) C++ yra virtuali funkcija, kuriai galime turėti įgyvendinimą, tačiau turime nepaisyti šios funkcijos išvestinėje klasėje, kitaip išvestinė klasė taip pat taps abstrakčia klase. Gryna virtuali funkcija deklaruojama deklaracijoje priskiriant 0.
Grynųjų virtualių funkcijų pavyzdys
C++
// An abstract class> class> Test {> >// Data members of class> public>:> >// Pure Virtual Function> >virtual> void> show() = 0;> >/* Other members */> };> |
>
>
Pilnas pavyzdys
Gryną virtualią funkciją įgyvendina klasės, kurios yra išvestos iš abstrakčios klasės.
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;> }> |
>
>Išvestis
fun() called>
Kai kurie įdomūs faktai
1. Klasė yra abstrakti, jei ji turi bent vieną gryną virtualią funkciją.
Pavyzdys
Žemiau esančiame C++ kode Testas yra abstrakti klasė, nes ji turi gryną virtualią funkciją show().
C++
java sūpynės
// 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;> }> |
>
>
Išvestis
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. Galime turėti abstrakčių klasių tipo rodyklių ir nuorodų.
Pavyzdžiui, toliau pateikta programa veikia gerai.
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->rodyti();> >return> 0;> }> |
>
>Išvestis
In Derived>
3. Jei išvestinėje klasėje nepaisysime grynosios virtualios funkcijos, tada išvestinė klasė taip pat tampa abstrakčia klase.
Toliau pateiktas pavyzdys rodo tą patį.
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;> }> |
>
>
Išvestis
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. Abstrakčioji klasė gali turėti konstruktorius.
Pavyzdžiui, ši programa sukompiliuojama ir veikia gerai.
C++
konvertuoti į dvigubą java
// 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->smagu();> >return> 0;> }> |
>
>Išvestis
Constructor of base called x = 4, y = 5 Constructor of base called x = 6, y = 7>
5. Abstrakčią klasę C++ taip pat galima apibrėžti naudojant struct raktinį žodį.
Pavyzdys
struct shapeClass { virtual void Draw()=0; }> Palyginimas su Java
„Java“ klasę galima padaryti abstrakčią naudojant abstraktų raktinį žodį. Panašiai funkcija gali būti visiškai virtuali arba abstrakti, naudojant abstraktų raktinį žodį. Matyti Abstrakčios klasės Java daugiau detalių.
Sąsaja vs abstrakčios klasės
Sąsaja neturi nė vieno savo metodo įgyvendinimo, ji gali būti laikoma metodų deklaracijų rinkiniu. C++ kalboje sąsaja gali būti imituojama paverčiant visus metodus grynai virtualius. Java sąsajai yra atskiras raktinis žodis.
Sąsają galime galvoti kaip antraštės failus C++, kaip ir antraštės failuose pateikiame tik klasės, kuri ketina ją įgyvendinti, turinį. Panašiai „Java“ sąsajoje pateikiame tik klasės turinį, o tikrąjį kodą rašome toje klasėje, kuri ją įgyvendina.