Introducción a la clase abstracta en C ++

Una clase es un tipo de datos definido por el usuario y tiene sus propios miembros y funciones de datos. Los miembros y las funciones se pueden usar creando un objeto o instancia de esa clase. La memoria se asigna para una clase solo cuando se crea un objeto.

Cuando queremos derivar algunos comportamientos o características de una clase a otra, usamos el concepto de herencia. Este es el método para heredar algunas propiedades de la clase primaria (clase base) a la clase secundaria (clase derivada).

En la implementación y herencia de clases, cuando queremos definir las mismas funciones tanto en la clase base como en la derivada, usamos la palabra clave 'virtual' junto con la función de clase base. Esta función 'virtual' especifica que la misma función se redefine o se anula en la clase derivada.

Una clase abstracta es una clase con función virtual pura. Ahora, ¿qué es una función virtual pura? Una función virtual pura es una función virtual que no tiene cuerpo y se asigna como 0. Este tipo de función se implementa cuando necesitamos una función pero actualmente no sabemos cuál es su función. Esta función debe implementarse o definirse en la clase derivada. Si no, la clase derivada también se convierte en una clase abstracta.

Una función virtual pura se define de la siguiente manera:

func virtual vacío () = 0;

Ejemplo de clase abstracta en C ++

Aquí, discutimos Ejemplo de clase abstracta en C ++ con detalles:

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

Salida:

Aquí Sample_Class es la clase base y Derived_Class se deriva de Sample_Class. Una función virtual pura llamada sample_func () se declara en la clase base. Se asigna a 0, lo que significa que no tiene a nadie y no se implementa nada dentro de la función. Por lo tanto, la clase base se ha convertido en una clase abstracta ya que tiene una función virtual pura. Inicialmente, cuando Derived_Class se deriva de la clase base, también se convierte en una clase abstracta. Pero en la clase derivada, se define la clase sample_func (), lo que evita que la clase derivada se convierta en una clase abstracta. Cuando se crea el objeto de clase derivado y se llama a la función, obtendremos el resultado impreso como 'se implementa la función virtual pura'.

No se puede instanciar una clase abstracta, lo que significa que no podemos crear una instancia u objeto para una clase abstracta. El objeto no se puede crear porque la clase no se implementa completamente. En realidad, es una base para una clase que se implementa completamente más adelante. Pero se pueden crear punteros o referencias para una clase abstracta. Este puntero se puede usar para llamar a las funciones de clase derivadas. Una clase abstracta puede tener otros miembros de datos y funciones similares a la implementación de clase normal junto con una función virtual pura.

El punto anterior se puede explicar a través del siguiente programa

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

Salida:

Aquí obtendremos un error ya que no se puede crear un objeto para la clase abstracta.

En su lugar, se puede implementar la segunda y tercera línea de código, se puede crear un puntero y se puede utilizar para llamar a la función de clase derivada.

Aquí, en la función anterior, Class1 es la clase base y, como tiene una función virtual pura (func1), se ha convertido en una clase abstracta. Class2 se deriva de la clase padre Class1. El func1 se define en la clase derivada. En la función principal, cuando intentamos crear un objeto de clase base tipo, obtendremos un error, ya que no se pueden crear objetos para la clase abstracta. Mientras que cuando intentamos crear un puntero de tipo de clase base, se creará con éxito y podemos apuntarlo a la clase derivada. Este puntero se puede usar para llamar a la función de clase derivada.

Una clase abstracta puede tener un constructor similar a la implementación de clase normal. En el caso del destructor, podemos declarar un destructor virtual puro. Es importante tener un destructor para eliminar la memoria asignada para la clase. El destructor virtual puro es un destructor que se asigna a 0 pero debe estar definido por la misma clase, ya que el destructor no suele anularse.

Ejemplo de implementación de constructor y destructor para Abstract Class en C ++

Aquí, discutimos Ejemplo de clase abstracta en C ++ con detalles:

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

Salida :

Aquí, en el ejemplo anterior, la clase Base es una clase abstracta con función virtual pura func1 (), un constructor y un destructor virtual puro. La función virtual pura se define en la clase derivada, evitando así que la clase derivada se convierta en una clase abstracta. El destructor virtual puro está definido por la clase Base fuera de la clase. Si queremos definir la función miembro de una clase fuera de la clase, el operador de resolución de alcance debe usarse como se muestra en el ejemplo. Se crea un puntero del tipo de clase base y apunta a la clase derivada. Cuando se llama al destructor usando 'delete', primero se llama al destructor de la clase derivada y luego al destructor de la clase base.

Conclusión

Por lo tanto, para compilar todo sobre una clase abstracta, podemos decir que la clase abstracta es una clase con una función virtual pura. Esta función virtual pura debe definirse en la clase derivada; de lo contrario, la clase derivada también se convierte en una clase abstracta. El objeto no se puede crear para la clase abstracta, pero se puede crear un puntero que se puede apuntar a la clase derivada.

Artículos recomendados

Esta es una guía para la clase abstracta en C ++. Aquí discutimos la introducción a la clase abstracta, así como la implementación de constructor y destructor en C ++ junto con su ejemplo. También puede consultar los siguientes artículos para obtener más información.

  1. Clase abstracta en Python
  2. Clase abstracta en Java
  3. Constructor y Destructor en C ++
  4. Anulación en C ++
  5. Anulación en Java
  6. Las 11 características y ventajas principales de C ++