logo

Čiste virtualne funkcije in abstraktni razredi v C++

Včasih implementacije vseh funkcij ni mogoče zagotoviti v osnovnem razredu, ker ne poznamo implementacije. Tak razred se imenuje an abstraktni razred .Na primer, naj bo Shape osnovni razred. Ne moremo zagotoviti implementacije funkcije draw() v Shape, vendar vemo, da mora imeti vsak izpeljani razred implementacijo draw(). Podobno razred Animal nima izvedbe move() (ob predpostavki, da se vse živali premikajo), vendar morajo vse živali vedeti, kako se premikati. Ne moremo ustvariti objektov abstraktnih razredov.

A čista virtualna funkcija (ali abstraktna funkcija) v C++ je navidezna funkcija, za katero lahko imamo implementacijo, vendar moramo to funkcijo preglasiti v izpeljanem razredu, sicer bo tudi izpeljani razred postal abstrakten razred. Čisto navidezno funkcijo deklariramo tako, da v deklaraciji dodelimo 0.

Primer čistih virtualnih funkcij

C++






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

>

>

Popolni primer

Čisto virtualno funkcijo izvajajo razredi, ki izhajajo iz abstraktnega razreda.

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;> }>

>

>

Izhod

123 film
fun() called>

Nekaj ​​zanimivih dejstev

1. Razred je abstrakten, če ima vsaj eno čisto virtualno funkcijo.

Primer

V spodnji kodi C++ je Test abstrakten razred, ker ima čisto virtualno funkcijo 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;> }>

>

>

python tuple razvrščen

Izhod

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. Lahko imamo kazalce in reference tipa abstraktnega razreda.

Na primer, naslednji program deluje dobro.

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->pokaži();> >return> 0;> }>

>

>

Izhod

In Derived>

3. Če v izpeljanem razredu ne preglasimo čiste virtualne funkcije, potem tudi izpeljani razred postane abstrakten razred.

Naslednji primer dokazuje isto.

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;> }>

>

>

Izhod

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. Abstraktni razred ima lahko konstruktorje.

Na primer, naslednji program se prevede in dobro deluje.

C++




java niz v logično

// 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->zabava();>> >return> 0;> }>

>

>

Izhod

Constructor of base called x = 4, y = 5 Constructor of base called x = 6, y = 7>

5. Abstraktni razred v C++ je mogoče definirati tudi s ključno besedo struct.

Primer

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

Primerjava z Javo

V Javi lahko razred naredimo abstrakten z uporabo abstraktne ključne besede. Podobno lahko funkcijo naredimo čisto virtualno ali abstraktno z uporabo abstraktne ključne besede. glej Abstraktni razredi v Javi za več podrobnosti.

Vmesnik proti abstraktnim razredom

Vmesnik nima implementacije nobene svoje metode, lahko ga obravnavamo kot zbirko deklaracij metod. V C++ je mogoče vmesnik simulirati tako, da so vse metode čisto virtualne. V Javi obstaja ločena ključna beseda za vmesnik.

Vmesnik si lahko predstavljamo kot datoteke glave v C++, tako kot v datotekah glave nudimo samo telo razreda, ki ga bo implementiral. Podobno v Javi v vmesniku zagotovimo samo telo razreda in napišemo dejansko kodo v katerem koli razredu, ki jo izvaja.