Wprowadzenie do klasy abstrakcyjnej w C ++

Klasa jest typem danych zdefiniowanym przez użytkownika i ma własne elementy danych i funkcje. Członków i funkcji można użyć, tworząc obiekt lub instancję tej klasy. Pamięć jest przydzielana dla klasy tylko podczas tworzenia obiektu.

Kiedy chcemy wyprowadzić pewne zachowania lub cechy z jednej klasy do drugiej, używamy pojęcia dziedziczenia. Jest to metoda dziedziczenia kilku właściwości z klasy nadrzędnej (klasa podstawowa) do klasy podrzędnej (klasa pochodna).

W implementacji i dziedziczeniu klas, gdy chcemy zdefiniować te same funkcje zarówno w klasie podstawowej, jak i pochodnej, używamy słowa kluczowego „virtual” wraz z funkcją klasy podstawowej. Ta funkcja „wirtualna” określa, że ​​ta sama funkcja jest przedefiniowana lub zastąpiona w klasie pochodnej.

Klasa abstrakcyjna to klasa z czystą funkcją wirtualną. Czym jest funkcja czysto wirtualna? Czysta funkcja wirtualna to funkcja wirtualna, która nie ma treści i jest przypisana jako 0. Ten typ funkcji jest implementowany, gdy potrzebujemy funkcji, ale obecnie nie wiemy, jaka jest jej funkcja. Ta funkcja musi zostać zaimplementowana lub zdefiniowana w klasie pochodnej. Jeśli nie, klasa pochodna staje się również klasą abstrakcyjną.

Czysta funkcja wirtualna jest zdefiniowana następująco:

virtual void func () = 0;

Przykład klasy abstrakcyjnej w C ++

Tutaj omawiamy Przykład klasy abstrakcyjnej w C ++ ze szczegółami:

#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();
)

Wynik:

Tutaj Sample_Class jest klasą podstawową, a Derived_Class jest pochodną klasy Sample_Class. Czysta funkcja wirtualna o nazwie sample_func () jest zadeklarowana w klasie bazowej. Jest przypisany do 0, co oznacza, że ​​nie ma nikogo i nic nie jest zaimplementowane w funkcji. Tak więc klasa podstawowa stała się klasą abstrakcyjną, ponieważ ma czystą funkcję wirtualną. Początkowo, gdy Derived_Class jest pochodną klasy podstawowej, staje się również klasą abstrakcyjną. Ale w klasie pochodnej zdefiniowana jest klasa sample_func (), co zapobiega przekształceniu klasy pochodnej w klasę abstrakcyjną. Kiedy tworzony jest obiekt klasy pochodnej i wywoływana jest funkcja, wydrukujemy wynik jako „zaimplementowano czystą funkcję wirtualną”.

Nie można utworzyć instancji klasy abstrakcyjnej, co oznacza, że ​​nie możemy utworzyć instancji ani obiektu dla klasy abstrakcyjnej. Nie można utworzyć obiektu, ponieważ klasa nie jest w pełni zaimplementowana. Jest to właściwie podstawa dla klasy, która została w pełni zaimplementowana później. Ale wskaźniki lub referencje mogą być tworzone dla klasy abstrakcyjnej. Ten wskaźnik może być używany do wywoływania pochodnych funkcji klasowych. Klasa abstrakcyjna może mieć inne elementy danych i funkcje podobne do normalnej implementacji klasy wraz z czystą funkcją wirtualną.

Powyższy punkt można wyjaśnić za pomocą poniższego 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();
)

Wynik:

Otrzymamy błąd, ponieważ nie można utworzyć obiektu dla klasy abstrakcyjnej.

Zamiast tego można zaimplementować drugą i trzecią linię kodu, można utworzyć wskaźnik i użyć go do wywołania funkcji klasy pochodnej.

Tutaj w powyższej funkcji klasa1 jest klasą podstawową, a ponieważ ma czystą funkcję wirtualną (func1), stała się klasą abstrakcyjną. Klasa 2 pochodzi od klasy nadrzędnej Class1. Func1 jest zdefiniowany w klasie pochodnej. W głównej funkcji, gdy próbujemy utworzyć obiekt klasy bazowej typu, otrzymamy błąd, ponieważ obiektów nie można utworzyć dla klasy abstrakcyjnej. Podczas gdy próbujemy utworzyć wskaźnik typu bazowego, zostanie on utworzony pomyślnie i możemy wskazać klasę pochodną. Tego wskaźnika można użyć do wywołania funkcji klasy pochodnej.

Klasa abstrakcyjna może mieć konstruktor podobny do normalnej implementacji klasy. W przypadku destruktora możemy zadeklarować czysty wirtualny destruktor. Ważne jest, aby mieć destruktor w celu usunięcia pamięci przydzielonej dla klasy. Czysty wirtualny destruktor jest destruktorem przypisanym do 0, ale musi być zdefiniowany przez tę samą klasę, ponieważ destruktor zwykle nie jest zastępowany.

Przykład implementacji konstruktora i destruktora dla klasy abstrakcyjnej w C ++

Tutaj omawiamy Przykład klasy abstrakcyjnej w C ++ ze szczegółami:

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

Wyjście :

Tutaj, w powyższym przykładzie Klasa podstawowa jest klasą abstrakcyjną z czystą funkcją wirtualną func1 (), konstruktorem i czystym wirtualnym destruktorem. Czysta funkcja wirtualna jest zdefiniowana w klasie pochodnej, a zatem zapobiega, aby klasa pochodna stała się klasą abstrakcyjną. Czysty wirtualny destruktor jest zdefiniowany przez klasę Base poza klasą. Jeśli chcemy zdefiniować funkcję składową klasy poza klasą, należy użyć operatora rozdzielczości zakresu, jak pokazano w przykładzie. Wskaźnik typu klasy bazowej jest tworzony i wskazywany na klasę pochodną. Gdy wywoływany jest destruktor za pomocą polecenia „usuń”, najpierw wywoływany jest destruktor klasy pochodnej, a następnie wywoływany jest destruktor klasy bazowej.

Wniosek

Stąd, aby skompilować wszystko o klasie abstrakcyjnej, możemy powiedzieć, że klasa abstrakcyjna jest klasą o czystej funkcji wirtualnej. Ta czysta funkcja wirtualna musi być zdefiniowana w klasie pochodnej, jeśli nie, to klasa pochodna staje się również klasą abstrakcyjną. Nie można utworzyć obiektu dla klasy abstrakcyjnej, ale można utworzyć wskaźnik, który można wskazać na klasę pochodną.

Polecane artykuły

To jest przewodnik po klasie abstrakcyjnej w C ++. Tutaj omawiamy wprowadzenie do klasy abstrakcyjnej, a także implementację konstruktora i destruktora w C ++ wraz z jego przykładem. Możesz także przejrzeć następujące artykuły, aby dowiedzieć się więcej-

  1. Klasa abstrakcyjna w Pythonie
  2. Klasa abstrakcyjna w Javie
  3. Constructor and Destructor w C ++
  4. Przesłanianie w C ++
  5. Przesłanianie w Javie
  6. 11 najważniejszych funkcji i zalet C ++