Saltar al contenido

¿Por qué no podemos crear una instancia de una clase abstracta?

Alfredo, miembro de este gran equipo, nos ha hecho el favor de redactar esta reseña porque controla perfectamente el tema.

Solución:

Su void bar()=0; no es válido – el =0 La notación solo se puede usar con funciones virtuales.

El punto central de una clase abstracta es que es abstracta: ha definido una interfaz pero no una implementación. Sin una implementación, instanciar la clase no produciría un resultado significativo o útil. Si tiene/tendría sentido crear instancias de objetos de esa clase, entonces simplemente no desea utilizar una clase abstracta en primer lugar.

Por ejemplo, considere los controladores de dispositivos. Podríamos tener un controlador para un dispositivo de almacenamiento abstracto. Definimos algunas capacidades para ese dispositivo, como leer y escribir datos. Esa clase abstracta le da a cualquier código que quiera leer/escribir datos la capacidad de trabajar con una clase concreta que se deriva de esa clase abstracta.

Sin embargo, no podemos simplemente instanciar nuestro dispositivo de almacenamiento abstracto. En su lugar, necesitamos un objeto concreto como una memoria USB, una unidad de disco, etc., para leer/escribir. La clase concreta es necesaria porque necesitamos un código específico del dispositivo real para ejecutar los comandos que hemos definido en nuestra base abstracta. Nuestra clase de almacenamiento abstracto solo tiene lectura o escritura, pero hacer la lectura o la escritura, necesitamos un controlador para un dispositivo específico. Uno puede saber cómo comunicarse con un disco duro SATA, mientras que otro sabe cómo comunicarse con una memoria USB y un tercero sabe cómo leer o escribir en una tarjeta SD. Nosotros no puedosin embargo, solo diga “Voy a crear un dispositivo de almacenamiento abstracto” y háblele sin definir el código real que traducirá un comando de “escritura” en (por ejemplo) las señales correctas que pasan por SATA, USB, Firewire , etc., para obtener los datos en un disco real.

Como tal, intentar instanciar nuestra clase abstracta no tiene sentido y no está permitido. Solo usamos la clase base abstracta para que el resto del sistema pueda manejar todos los dispositivos de manera uniforme. Al resto del código no le importa cómo las señales son diferentes entre sí, solo ve un montón de unidades de disco y puede funcionar con todas ellas, aunque los detalles de leer datos a través de USB son completamente diferentes de leer a través de Firewire (por ejemplo).

Una clase abstracta representa algo que no es lo suficientemente específico para ser instanciado. Por ejemplo, ¿qué pasaría si alguien te pidiera que crearas un vehículo? Habría que preguntar, “¿qué tipo de vehículo?” No sabrías si crear un automóvil, un trineo o un transbordador espacial. No existe tal objeto como un “vehículo”. Sin embargo, “vehículo” es una abstracción útil que se puede usar para agrupar objetos, indicando comportamientos comunes entre ellos. Para eso están las clases abstractas.

Una clase abstracta es más que una interfaz. Puede tener miembros de datos. Puede tener funciones miembro que no sean puramente virtuales o no virtuales en absoluto. Incluso una función virtual pura puede tener un cuerpo, proporcionando una implementación predeterminada. Así que no se trata de una imposibilidad física de instanciar una clase abstracta.

El punto principal es que una función virtual pura es una función virtual que deber ser anulado por una clase derivada. Eso significa que una clase derivada deber definirse, y la forma de forzar eso es prohibir la instanciación de una clase abstracta.

Una clase abstracta no es lo suficientemente específica para ser instanciada. No necesariamente porque le falte una definición de una función, porque puede que no le falte. No es lo suficientemente específico porque representa un resumen concepto, que debe ser más específico antes de que pueda ser ejemplificado.

Al final de la artículo puedes encontrar los informes de otros administradores, tú además puedes mostrar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *