A veces, la implementación de todas las funciones no se puede proporcionar en una clase base porque no conocemos la implementación. Esta clase se llama clase abstracta Por ejemplo, dejemos que Shape sea una clase base. No podemos proporcionar la implementación de la función draw() en Shape, pero sabemos que cada clase derivada debe tener una implementación de draw(). De manera similar, una clase Animal no tiene la implementación de move() (asumiendo que todos los animales se mueven), pero todos los animales deben saber cómo moverse. No podemos crear objetos de clases abstractas.
A función virtual pura (o función abstracta) en C++ es una función virtual para la cual podemos tener una implementación, pero debemos anular esa función en la clase derivada; de lo contrario, la clase derivada también se convertirá en una clase abstracta. Una función virtual pura se declara asignando 0 en la declaración.
Ejemplo de funciones virtuales puras
C++
// An abstract class> class> Test {> >// Data members of class> public>:> >// Pure Virtual Function> >virtual> void> show() = 0;> >/* Other members */> };> |
>
>
Ejemplo completo
Una función virtual pura se implementa mediante clases que se derivan de una clase abstracta.
C++
carácter a cadena java
// C++ Program to illustrate the abstract class and virtual> // functions> #include> using> namespace> std;> class> Base {> >// private member variable> >int> x;> public>:> >// pure virtual function> >virtual> void> fun() = 0;> >// getter function to access x> >int> getX() {>return> x; }> };> // This class inherits from Base and implements fun()> class> Derived :>public> Base {> >// private member variable> >int> y;> public>:> >// implementation of the pure virtual function> >void> fun() { cout <<>'fun() called'>; }> };> int> main(>void>)> {> >// creating an object of Derived class> >Derived d;> >// calling the fun() function of Derived class> >d.fun();> >return> 0;> }> |
>
>Producción
fun() called>
Algunos datos interesantes
1. Una clase es abstracta si tiene al menos una función virtual pura.
Ejemplo
En el siguiente código C++, Test es una clase abstracta porque tiene una función virtual pura show().
C++
no es igual a mysql
// C++ program to illustrate the abstract class with pure> // virtual functions> #include> using> namespace> std;> class> Test {> >// private member variable> >int> x;> public>:> >// pure virtual function> >virtual> void> show() = 0;> >// getter function to access x> >int> getX() {>return> x; }> };> int> main(>void>)> {> >// Error: Cannot instantiate an abstract class> >Test t;> >return> 0;> }> |
>
>
Producción
Compiler Error: cannot declare variable 't' to be of abstract type 'Test' because the following virtual functions are pure within 'Test': note: virtual void Test::show()>
2. Podemos tener punteros y referencias de tipo clase abstracta.
Por ejemplo, el siguiente programa funciona bien.
C++
// C++ program that demonstrate that> // we can have pointers and references> // of abstract class type.> #include> using> namespace> std;> class> Base {> public>:> >// pure virtual function> >virtual> void> show() = 0;> };> class> Derived :>public> Base {> public>:> >// implementation of the pure virtual function> >void> show() { cout <<>'In Derived
'>; }> };> int> main(>void>)> {> >// creating a pointer of type> >// Base pointing to an object> >// of type Derived> >Base* bp =>new> Derived();> >// calling the show() function using the> >// pointer> >bp->mostrar();> >return> 0;> }> |
>
>Producción
In Derived>
3. Si no anulamos la función virtual pura en la clase derivada, entonces la clase derivada también se convierte en una clase abstracta.
El siguiente ejemplo demuestra lo mismo.
C++
// C++ program to demonstrate that if we do not override> // the pure virtual function in the derived class, then> // the derived class also becomes an abstract class> #include> using> namespace> std;> class> Base {> public>:> >// pure virtual function> >virtual> void> show() = 0;> };> class> Derived :>public> Base {> };> int> main(>void>)> {> >// creating an object of Derived class> >Derived d;> >return> 0;> }> |
>
>
Producción
Compiler Error: cannot declare variable 'd' to be of abstract type 'Derived' because the following virtual functions are pure within 'Derived': virtual void Base::show()>
4. Una clase abstracta puede tener constructores.
Por ejemplo, el siguiente programa se compila y ejecuta bien.
C++
cómo comprobar el tamaño de la pantalla
// C++ program to demonstrate that> // an abstract class can have constructors.> #include> using> namespace> std;> // An abstract class with constructor> class> Base {> protected>:> >// protected member variable> >int> x;> public>:> >// pure virtual function> >virtual> void> fun() = 0;> >// constructor of Base class> >Base(>int> i)> >{> >x = i;> >cout <<>'Constructor of base called
'>;> >}> };> class> Derived :>public> Base {> >// private member variable> >int> y;> public>:> >// calling the constructor of Base class> >Derived(>int> i,>int> j)> >: Base(i)> >{> >y = j;> >}> >// implementation of pure virtual function> >void> fun()> >{> >cout <<>'x = '> << x <<>', y = '> << y <<>'
'>;> >}> };> int> main(>void>)> {> >// creating an object of Derived class> >Derived d(4, 5);> >// calling the fun() function of Derived class> >d.fun();> >// creating an object of Derived class using> >// a pointer of the Base class> >Base* ptr =>new> Derived(6, 7);> >// calling the fun() function using the> >// pointer> >ptr->divertido();> >return> 0;> }> |
>
>Producción
Constructor of base called x = 4, y = 5 Constructor of base called x = 6, y = 7>
5. También se puede definir una clase abstracta en C++ usando la palabra clave struct.
Ejemplo
struct shapeClass { virtual void Draw()=0; }> Comparación con Java
En Java, una clase se puede hacer abstracta mediante el uso de una palabra clave abstracta. De manera similar, una función se puede hacer puramente virtual o abstracta mediante el uso de una palabra clave abstracta. Ver Clases abstractas en Java para más detalles.
Interfaz vs clases abstractas
Una interfaz no tiene implementación de ninguno de sus métodos, puede considerarse como una colección de declaraciones de métodos. En C++, se puede simular una interfaz haciendo que todos los métodos sean puramente virtuales. En Java, hay una palabra clave separada para la interfaz.
Podemos pensar en Interface como archivos de encabezado en C++, como en los archivos de encabezado solo proporcionamos el cuerpo de la clase que lo implementará. De manera similar, en Java en Interface solo proporcionamos el cuerpo de la clase y escribimos el código real en cualquier clase que lo implemente.