Einführung in Abstract Class in C ++

Eine Klasse ist ein vom Benutzer definierter Datentyp mit eigenen Datenelementen und Funktionen. Die Elemente und Funktionen können verwendet werden, indem ein Objekt oder eine Instanz dieser Klasse erstellt wird. Speicher wird nur dann für eine Klasse reserviert, wenn ein Objekt erstellt wird.

Wenn wir Verhaltensweisen oder Merkmale von einer Klasse zu einer anderen Klasse ableiten möchten, verwenden wir das Konzept der Vererbung. Dies ist die Methode zum Erben weniger Eigenschaften von der übergeordneten Klasse (Basisklasse) an die untergeordnete Klasse (abgeleitete Klasse).

Wenn wir in der Klassenimplementierung und -vererbung dieselben Funktionen sowohl in der Basisklasse als auch in der abgeleiteten Klasse definieren möchten, verwenden wir das Schlüsselwort 'virtual' zusammen mit der Basisklassenfunktion. Diese "virtuelle" Funktion gibt an, dass dieselbe Funktion in der abgeleiteten Klasse neu definiert oder überschrieben wird.

Eine abstrakte Klasse ist eine Klasse mit rein virtueller Funktion. Was ist nun eine rein virtuelle Funktion? Eine rein virtuelle Funktion ist eine virtuelle Funktion, die keinen Hauptteil hat und mit 0 belegt ist. Diese Art von Funktion wird implementiert, wenn wir eine Funktion benötigen, aber derzeit nicht wissen, um welche Funktion es sich handelt. Diese Funktion muss in der abgeleiteten Klasse implementiert oder definiert werden. Wenn nicht, wird die abgeleitete Klasse auch zu einer abstrakten Klasse.

Eine rein virtuelle Funktion ist wie folgt definiert:

virtuelle Leere func () = 0;

Beispiel für eine abstrakte Klasse in C ++

Hier diskutieren wir ein Beispiel für eine abstrakte Klasse in C ++ mit Details:

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

Ausgabe:

Hier ist Sample_Class die Basisklasse und Derived_Class wird von der Sample_Class abgeleitet. In der Basisklasse ist eine reine virtuelle Funktion namens sample_func () deklariert. Es wird 0 zugewiesen, was bedeutet, dass es niemanden hat und nichts in der Funktion implementiert ist. Somit ist die Basisklasse eine abstrakte Klasse geworden, da sie eine rein virtuelle Funktion hat. Wenn die Derived_Class von der Basisklasse abgeleitet wird, wird sie zunächst auch zu einer abstrakten Klasse. In der abgeleiteten Klasse ist jedoch die sample_func () -Klasse definiert, die verhindert, dass die abgeleitete Klasse zu einer abstrakten Klasse wird. Wenn das abgeleitete Klassenobjekt erstellt und die Funktion aufgerufen wird, wird die Ausgabe als "reine virtuelle Funktion implementiert" ausgegeben.

Eine abstrakte Klasse kann nicht instanziiert werden, was bedeutet, dass wir keine Instanz oder kein Objekt für eine abstrakte Klasse erstellen können. Das Objekt kann nicht erstellt werden, da die Klasse nicht vollständig implementiert ist. Es ist eigentlich eine Basis für eine Klasse, die später vollständig implementiert wird. Es können jedoch Zeiger oder Referenzen für eine abstrakte Klasse erstellt werden. Mit diesem Zeiger können die abgeleiteten Klassenfunktionen aufgerufen werden. Eine abstrakte Klasse kann andere Datenelemente und Funktionen haben, die der normalen Klassenimplementierung ähnlich sind, sowie eine rein virtuelle Funktion.

Der obige Punkt kann durch das folgende Programm erklärt werden

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

Ausgabe:

Hier wird ein Fehler angezeigt, da für die abstrakte Klasse kein Objekt erstellt werden kann.

Stattdessen können die zweite und dritte Codezeile implementiert, ein Zeiger erstellt und die abgeleitete Klassenfunktion aufgerufen werden.

Hier ist in der obigen Funktion Class1 die Basisklasse und da es eine rein virtuelle Funktion (func1) hat, ist es eine abstrakte Klasse geworden. Class2 wird von der Elternklasse Class1 abgeleitet. Die Funktion 1 ist in der abgeleiteten Klasse definiert. Wenn wir versuchen, ein Objekt vom Typ Basisklasse zu erstellen, wird in der Hauptfunktion eine Fehlermeldung angezeigt, da Objekte nicht für abstrakte Klassen erstellt werden können. Wenn wir hingegen versuchen, einen Zeiger vom Typ Basisklasse zu erstellen, wird dieser erfolgreich erstellt und wir können ihn auf die abgeleitete Klasse verweisen. Mit diesem Zeiger kann die abgeleitete Klassenfunktion aufgerufen werden.

Eine abstrakte Klasse kann einen Konstruktor haben, der der normalen Klassenimplementierung ähnelt. Im Fall des Destruktors können wir einen reinen virtuellen Destruktor deklarieren. Es ist wichtig, einen Destruktor zu haben, um den für die Klasse zugewiesenen Speicher zu löschen. Ein reiner virtueller Destruktor ist ein Destruktor, der 0 zugewiesen ist, aber von derselben Klasse definiert werden muss, da der Destruktor normalerweise nicht überschrieben wird.

Beispiel für die Implementierung von Konstruktor und Destruktor für Abstract Class in C ++

Hier diskutieren wir ein Beispiel für eine abstrakte Klasse in C ++ mit Details:

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

Ausgabe :

In diesem Beispiel ist die Basisklasse eine abstrakte Klasse mit der reinen virtuellen Funktion func1 (), einem Konstruktor und einem reinen virtuellen Destruktor. Die reine virtuelle Funktion wird in der abgeleiteten Klasse definiert, wodurch verhindert wird, dass die abgeleitete Klasse zu einer abstrakten Klasse wird. Der reine virtuelle Destruktor wird von der Basisklasse außerhalb der Klasse definiert. Wenn Sie die Elementfunktion einer Klasse außerhalb der Klasse definieren möchten, sollten Sie den im Beispiel gezeigten Operator für die Bereichsauflösung verwenden. Ein Zeiger vom Typ Basisklasse wird erstellt und auf die abgeleitete Klasse gezeigt. Wenn Destruktor mit 'delete' aufgerufen wird, wird zuerst der abgeleitete Klassendestruktor und dann der Basisklassendestruktor aufgerufen.

Fazit

Um also alles über eine abstrakte Klasse zu kompilieren, können wir sagen, dass die abstrakte Klasse eine Klasse mit einer rein virtuellen Funktion ist. Diese rein virtuelle Funktion muss in der abgeleiteten Klasse definiert werden, andernfalls wird die abgeleitete Klasse auch zu einer abstrakten Klasse. Das Objekt kann nicht für eine abstrakte Klasse erstellt werden, es kann jedoch ein Zeiger erstellt werden, der auf die abgeleitete Klasse verweist.

Empfohlene Artikel

Dies ist eine Anleitung für Abstract Class in C ++. Hier diskutieren wir die Einführung in die abstrakte Klasse sowie die Implementierung von Konstruktor und Destruktor in C ++ zusammen mit ihrem Beispiel. Sie können sich auch die folgenden Artikel ansehen, um mehr zu erfahren.

  1. Abstrakte Klasse in Python
  2. Abstrakte Klasse in Java
  3. Konstruktor und Destruktor in C ++
  4. Überschreiben in C ++
  5. In Java überschreiben
  6. Top 11 Features und Vorteile von C ++