Úvod do abstraktní třídy v C ++

Třída je datový typ definovaný uživatelem a má své vlastní datové členy a funkce. Členy a funkce lze použít vytvořením objektu nebo instance této třídy. Paměť je přidělena třídě pouze při vytvoření objektu.

Chceme-li odvodit některá chování nebo charakteristiky z jedné třídy do druhé třídy, používáme koncept dědičnosti. Toto je metoda zdědění několika vlastností z nadřazené třídy (základní třída) do podřízené třídy (odvozené třídy).

Při implementaci a dědičnosti třídy, když chceme definovat stejné funkce jak v základní, tak odvozené třídě, použijeme klíčové slovo „virtuální“ spolu s funkcí základní třídy. Tato „virtuální“ funkce určuje, že stejná funkce je v odvozené třídě znovu definována nebo přepsána.

Abstraktní třída je třída s čistě virtuální funkcí. Co je to čistě virtuální funkce? Čistá virtuální funkce je virtuální funkce, která nemá tělo a je přiřazena jako 0. Tento typ funkce je implementován, když potřebujeme funkci, ale v současné době nevíme, co je její funkce. Tato funkce musí být implementována nebo definována v odvozené třídě. Pokud ne, odvozená třída se také stane abstraktní třídou.

Čistá virtuální funkce je definována následovně:

virtuální prázdnota func () = 0;

Příklad abstraktní třídy v C ++

Zde diskutujeme příklad abstraktní třídy v C ++ s podrobnostmi:

#include
using namespace std;
class Sample_Class (
int a = 5;
public:
virtual void sample_func() = 0;
void print_func() (
cout << a;
)
);
class Derived_Class : public Sample_Class (
public:
void sample_func() (
cout << "pure virtual function is implemented";
)
);
int main() (
Derived_Class d_object;
d_object.sample_func();
)

Výstup:

Tady Sample_Class je základní třída a Derived_Class je odvozeno od Sample_Class. V základní třídě je deklarována čistě virtuální funkce nazvaná sample_func (). Je přiřazena k 0, což znamená, že nemá nikoho a nic není implementováno uvnitř funkce. Základní třída se tak stala abstraktní třídou, protože má čistě virtuální funkci. Zpočátku, když je Derived_Class odvozen ze základní třídy, stává se také abstraktní třídou. Ve odvozené třídě je však definována třída sample_func (), která brání odvozené třídě stát se abstraktní třídou. Po vytvoření odvozeného objektu třídy a vyvolání funkce se výstup vytiskne jako implementace „čisté virtuální funkce“.

Nelze vytvořit instanci abstraktní třídy, což znamená, že nemůžeme vytvořit instanci nebo objekt pro abstraktní třídu. Objekt nelze vytvořit, protože třída není plně implementována. Je to vlastně základ pro třídu, která je plně implementována později. U abstraktní třídy však lze vytvořit ukazatele nebo odkazy. Tento ukazatel lze použít k vyvolání odvozených funkcí třídy. Abstraktní třída může mít další datové členy a funkce podobné implementaci normální třídy spolu s čistě virtuální funkcí.

Výše uvedený bod lze vysvětlit pomocí níže uvedeného programu

class Class1 (
int a;
public:
virtual void func1() = 0;
void func2() (
cout << "base class";
)
);
class Class2 : public Class1 (
public:
void func1() (
cout << "func1 in derived class";
)
);
int main() (
Class1 b; //---------- > this line will cause an error
//Class1 *b = new Class2(); //---------- > pointer can be created, so this line is correct
// b -> func1();
)

Výstup:

Zde dostaneme chybu, protože objekt nelze vytvořit pro abstraktní třídu.

Místo toho lze implementovat druhý a třetí řádek kódu, lze vytvořit ukazatel a lze jej použít k vyvolání odvozené funkce třídy.

Zde je ve výše uvedené funkci Class1 základní třída a protože má čistě virtuální funkci (func1), stala se abstraktní třídou. Class2 je odvozena z nadřazené třídy Class1. Func1 je definován v odvozené třídě. V hlavní funkci, když se pokusíme vytvořit objekt typu základní třídy, dostaneme chybu, protože objekty nelze vytvořit pro abstraktní třídu. Zatímco když se pokusíme vytvořit ukazatel typu základní třídy, bude vytvořen úspěšně a můžeme ho nasměrovat na odvozenou třídu. Tento ukazatel lze použít k vyvolání odvozené funkce třídy.

Abstraktní třída může mít konstruktor podobný implementaci normální třídy. V případě destruktoru můžeme deklarovat čistě virtuální destruktor. Je důležité mít destruktor pro odstranění paměti přidělené pro třídu. Čistý virtuální destruktor je destruktor, který je přiřazen k 0, ale musí být definován stejnou třídou, protože destruktor obvykle není přepsán.

Příklad implementace konstruktoru a destruktoru pro abstraktní třídu v C ++

Zde diskutujeme příklad abstraktní třídy v C ++ s podrobnostmi:

class Base (
public:
int a;
virtual void func1() = 0;
// Constructor
Base(int i) (
a = i;
)
// Pure Virtual destructor
virtual ~Base() = 0;
);
// Pure virtual destructor is defined
Base :: ~Base() (
cout << "Pure virtual destructor is defined here" << endl;
)
class Derived : public Base (
int b;
public:
// Constructor of derived class
Derived(int x, int y) : Base(y) ( b = x; )
// Destructor of derived class
~Derived() (
cout << "Derived class destructor" << endl;
)
//Definition for pure virtual function
void func1() (
cout << "The value of a is " << a << " and b is " << b << endl;
)
);
int main() (
Base *b = new Derived(5, 10);
b->func1();
delete b;
)

Výstup :

Ve výše uvedeném příkladu je základní třída abstraktní třída s čistě virtuální funkcí func1 (), konstruktor a čistě virtuální destruktor. Čistá virtuální funkce je definována v odvozené třídě, takže brání odvozené třídě stát se abstraktní třídou. Čistý virtuální destruktor je definován základní třídou mimo třídu. Pokud chceme definovat členské funkce třídy mimo třídu, měl by být použit operátor rozlišení rozsahu, jak je uvedeno v příkladu. Vytvoří se ukazatel typu základní třídy a odkazuje na odvozenou třídu. Když je destruktor volán pomocí 'delete', je nejprve vyvolán deštruktor odvozené třídy a potom je volán destruktor základní třídy.

Závěr

Abychom tedy mohli zkompilovat vše o abstraktní třídě, můžeme říci, že abstraktní třída je třída s čistě virtuální funkcí. Tato čistě virtuální funkce musí být definována v odvozené třídě, pokud ne, pak se odvozená třída také stane abstraktní třídou. Objekt nemůže být vytvořen pro abstraktní třídu, ale lze vytvořit ukazatel, který lze ukázat na odvozenou třídu.

Doporučené články

Toto je průvodce abstraktní třídou v C ++. Zde diskutujeme úvod do abstraktní třídy a implementaci konstruktoru a destruktoru v C ++ spolu s jeho příkladem. Další informace naleznete také v následujících článcích

  1. Abstraktní třída v Pythonu
  2. Abstraktní třída v Javě
  3. Konstruktor a ničitel v C ++
  4. Převažující v C ++
  5. Převažující v Javě
  6. Prvních 11 funkcí a výhod C ++

Kategorie: