Definición de funciones virtuales puras
En C++, una función virtual pura se declara asignando el valor 0 en su definición. Esto obliga a cualquier clase derivada a proporcionar su propia implementación. Ejemplo de declaración:
class IGraphicObject {
public:
virtual void render() = 0;
virtual ~IGraphicObject() noexcept = default;
};
Clases abstractas (clases con funciones virtuales puras)
Una clase que contiene al menos una función virtual pura se convierte en abstracta. No se permiten instancias directas de estas clases. Las clases derivadas deben implementar todas las funciones virtuales puras heredadas, o también serán consideradas abstractas.
Diferencias clave con interfaces de C#
- C++ permite clases abstractas con datos miembro y métodos concretos
- Se puede proporcionar implementación predeterminada incluso para funciones virtuales puras
- Se permite herencia múltiple de clases abstractas
- El destructor virtual es esencial para evitar fugas de memoria
Importancia del destructor virtual
Al eliminar objetos mediante punteros a la clase base, el destructor debe ser virtual:
IShape* figure = new Square();
delete figure; // Sin destructor virtual: comportamiento indefinido
Sin el destructor virtual, solo se ejecuta el destructor de la clase base, provocando posibles fugas de recursos en las clases derivadas.
Patrón de diseño para interfaces en C++
Para replicar el comportamiento de interfaces de C#:
- Definir solo funciones virtuales puras
- Incluir un destructor virtual
- No incluir datos miembro
Ejemplo de implementación:
class IPersistible {
public:
virtual void serialize() = 0;
virtual ~IPersistible() = default;
};
class IAuditable {
public:
virtual void registrarEvento() = 0;
virtual ~IAuditable() = default;
};
class ServicioArchivo : public IPersistible, public IAuditable {
public:
void serialize() override { /* implementación */ }
void registrarEvento() override { /* implementación */ }
};
Resumen técnico
- Las funciones virtuales puras se declaran con
= 0 - Las clases con funciones virtuales puras no pueden instanciarse directamente
- Las clases derivadas deben implementar todas las funciones virtuales puras
- Siempre definir destructores virtuales en clases base
- La herencia múltiple de clases abstractas permite composición de interfaces