Dažreiz visu funkciju ieviešanu nevar nodrošināt bāzes klasē, jo mēs nezinām ieviešanu. Šādu klasi sauc par an abstraktā klase .Piemēram, lai Shape ir bāzes klase. Mēs nevaram nodrošināt funkcijas draw() ieviešanu Shape, taču mēs zinām, ka katrai atvasinātajai klasei ir jābūt draw() ieviešanai. Tāpat Dzīvnieku klasē nav pārvietošanas() ieviešanas (pieņemot, ka visi dzīvnieki pārvietojas), bet visiem dzīvniekiem ir jāzina, kā pārvietoties. Mēs nevaram izveidot abstraktu klašu objektus.
A tīra virtuāla funkcija (vai abstraktā funkcija) valodā C++ ir virtuāla funkcija, kurai var būt implementācija, taču mums šī funkcija ir jāignorē atvasinātajā klasē, pretējā gadījumā atvasinātā klase kļūs arī par abstraktu klasi. Tīri virtuāla funkcija tiek deklarēta, deklarācijā piešķirot 0.
java masīvu saraksts
Pure Virtual Functions piemērs
C++
// An abstract class> class> Test {> >// Data members of class> public>:> >// Pure Virtual Function> >virtual> void> show() = 0;> >/* Other members */> };> |
>
>
Pilnīgs piemērs
Tīri virtuālo funkciju īsteno klases, kas ir atvasinātas no abstraktās klases.
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;> }> |
>
>Izvade
fun() called>
Daži interesanti fakti
1. Klase ir abstrakta, ja tai ir vismaz viena tīra virtuāla funkcija.
Piemērs
Zemāk esošajā C++ kodā Test ir abstrakta klase, jo tai ir tīra virtuāla funkcija 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;> }> |
>
>
Izvade
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. Mums var būt abstrakta klases tipa norādes un atsauces.
Piemēram, šī programma darbojas labi.
C++
centos vs redhat
// 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->parādīt();> >return> 0;> }> |
>
>Izvade
In Derived>
3. Ja atvasinātajā klasē neiekļaujam tīro virtuālo funkciju, tad arī atvasinātā klase kļūst par abstraktu klasi.
Nākamais piemērs parāda to pašu.
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;> }> |
>
>
Izvade
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. Abstraktajai klasei var būt konstruktori.
Piemēram, tālāk norādītā programma tiek apkopota un darbojas labi.
C++
ascii no a in 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->jautri();> >return> 0;> }> |
>
>Izvade
Constructor of base called x = 4, y = 5 Constructor of base called x = 6, y = 7>
5. Abstraktu klasi C++ var definēt arī izmantojot struct atslēgvārdu.
Piemērs
struct shapeClass { virtual void Draw()=0; }> Salīdzinājums ar Java
Programmā Java klasi var padarīt abstraktu, izmantojot abstraktu atslēgvārdu. Līdzīgi funkciju var padarīt tīri virtuālu vai abstraktu, izmantojot abstraktu atslēgvārdu. Skat Abstraktās klases Java valodā lai iegūtu sīkāku informāciju.
Interfeiss pret abstraktajām klasēm
Interfeisam nav nevienas tās metodes ieviešanas, to var uzskatīt par metožu deklarāciju kolekciju. Programmā C++ interfeisu var simulēt, padarot visas metodes tīri virtuālas. Java saskarnei ir atsevišķs atslēgvārds.
Mēs varam domāt par saskarni kā C++ galvenes failiem, tāpat kā galvenes failos mēs sniedzam tikai tās klases pamattekstu, kas to ieviesīs. Līdzīgi Java in Interface mēs nodrošinām tikai klases pamattekstu un rakstām faktisko kodu neatkarīgi no klases, kas to ievieš.