Введение в абстрактный класс в C ++

Класс - это тип данных, определенный пользователем, и он имеет свои собственные элементы данных и функции. Члены и функции могут быть использованы путем создания объекта или экземпляра этого класса. Память выделяется для класса только при создании объекта.

Когда мы хотим вывести некоторые виды поведения или характеристики из одного класса в другой, мы используем концепцию наследования. Это метод наследования нескольких свойств от родительского класса (базовый класс) к дочернему классу (производный класс).

В реализации и наследовании класса, когда мы хотим определить одинаковые функции как в базовом, так и в производном классе, мы используем ключевое слово «virtual» вместе с функцией базового класса. Эта «виртуальная» функция указывает, что та же функция переопределяется или переопределяется в производном классе.

Абстрактный класс - это класс с чисто виртуальной функцией. Теперь, что такое чисто виртуальная функция? Чистая виртуальная функция - это виртуальная функция, которая не имеет тела и назначается как 0. Этот тип функции реализуется, когда нам нужна функция, но в настоящее время мы не знаем, какова ее функция. Эта функция должна быть реализована или определена в производном классе. Если нет, то производный класс также становится абстрактным классом.

Чистая виртуальная функция определяется следующим образом:

virtual void func () = 0;

Пример абстрактного класса в C ++

Здесь мы обсуждаем Пример абстрактного класса в C ++ с деталями:

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

Выход:

Здесь Sample_Class является базовым классом, а Derived_Class является производным от Sample_Class. Чистая виртуальная функция с именем sample_func () объявлена ​​в базовом классе. Он присваивается 0, что означает, что в нем нет никого, и внутри функции ничего не реализовано. Таким образом, базовый класс стал абстрактным классом, поскольку он имеет чисто виртуальную функцию. Первоначально, когда Derived_Class является производным от базового класса, он также становится абстрактным классом. Но в производном классе определен класс sample_func (), который предотвращает превращение производного класса в абстрактный. Когда объект производного класса создается и вызывается функция, мы выводим вывод в виде «реализована чисто виртуальная функция».

Абстрактный класс не может быть создан, что означает, что мы не можем создать экземпляр или объект для абстрактного класса. Объект не может быть создан, потому что класс не реализован полностью. На самом деле это основа для класса, который будет полностью реализован позже. Но указатели или ссылки могут быть созданы для абстрактного класса. Этот указатель можно использовать для вызова функций производного класса. Абстрактный класс может иметь другие члены-данные и функции, подобные обычной реализации класса, наряду с чисто виртуальной функцией.

Вышеуказанный момент можно объяснить с помощью приведенной ниже программы

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

Выход:

Здесь мы получим ошибку, так как объект не может быть создан для абстрактного класса.

Вместо этого можно реализовать 2- ю и 3- ю строку кода, создать указатель и использовать его для вызова функции производного класса.

Здесь в приведенной выше функции Class1 является базовым классом, и, поскольку он имеет чисто виртуальную функцию (func1), он стал абстрактным классом. Class2 является производным от родительского класса Class1. Func1 определен в производном классе. В основной функции, когда мы пытаемся создать объект базового класса типа, мы получим ошибку, поскольку объекты не могут быть созданы для абстрактного класса. Принимая во внимание, что когда мы пытаемся создать указатель типа базового класса, он будет создан успешно, и мы можем указать его на производный класс. Этот указатель можно использовать для вызова производной функции класса.

Абстрактный класс может иметь конструктор, похожий на обычную реализацию класса. В случае деструктора мы можем объявить чисто виртуальный деструктор. Важно иметь деструктор для удаления памяти, выделенной для класса. Чистый виртуальный деструктор - это деструктор, назначенный 0, но он должен быть определен тем же классом, поскольку деструктор обычно не переопределяется.

Пример реализации конструктора и деструктора для абстрактного класса в C ++

Здесь мы обсуждаем Пример абстрактного класса в C ++ с деталями:

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

Выход :

Здесь в приведенном выше примере базовый класс представляет собой абстрактный класс с чисто виртуальной функцией func1 (), конструктором и чисто виртуальным деструктором. Чистая виртуальная функция определена в производном классе, что предотвращает превращение производного класса в абстрактный класс. Чистый виртуальный деструктор определяется базовым классом вне класса. Если мы хотим определить функцию-член класса вне класса, следует использовать оператор разрешения области действия, как показано в примере. Указатель типа базового класса создается и указывает на производный класс. Когда деструктор вызывается с помощью «delete», сначала вызывается деструктор производного класса, а затем вызывается деструктор базового класса.

Вывод

Следовательно, чтобы скомпилировать все об абстрактном классе, мы можем сказать, что абстрактный класс - это класс с чисто виртуальной функцией. Эта чисто виртуальная функция должна быть определена в производном классе, если нет, то производный класс также становится абстрактным классом. Объект не может быть создан для абстрактного класса, но может быть создан указатель, который может указывать на производный класс.

Рекомендуемые статьи

Это руководство по абстрактному классу в C ++. Здесь мы обсуждаем введение в абстрактный класс, а также реализацию конструктора и деструктора в C ++ вместе с его примером. Вы также можете посмотреть следующие статьи, чтобы узнать больше

  1. Абстрактный класс в Python
  2. Абстрактный класс на Java
  3. Конструктор и деструктор в C ++
  4. Переопределение в C ++
  5. Переопределение в Java
  6. Лучшие 11 функций и преимуществ C ++