Contenido del Curso
POO en C++
POO en C++
Método Virtual Puro
El concepto de métodos virtuales es fundamental para lograr el polimorfismo, permitiendo un diseño de software flexible y extensible. Los métodos virtuales puros amplían esto al definir interfaces y admitir la vinculación dinámica.
Sintaxis de método virtual puro
Un método virtual puro se declara con la palabra clave virtual
y se inicializa a cero. Esto indica que la función no tiene definición dentro de la class
y debe ser sobrescrita por cualquier subclase antes de que se puedan instanciar objetos de esa class
.
virtual.h
virtual void example() = 0;
Este método funciona de manera similar a uno estándar, excepto que carece de un cuerpo encerrado en { }
y, en su lugar, termina con = 0;
, lo que indica que no tiene implementación. Sin embargo, las demás reglas para este método son las mismas que para los métodos regulares.
Declarar un método virtual puro convierte la class
donde se declara en abstracta, lo que significa que se vuelve imposible instanciar objetos de esa clase. Esta restricción existe porque cada método dentro de la class
debe ser implementado antes de crear y utilizar una instancia, con el fin de prevenir errores y comportamientos impredecibles. Observe el siguiente código:
Animal.h
class Animal { public: virtual void speak() = 0; };
La Animal
class
presenta un método virtual puro llamado speak()
, lo que impide la instanciación de objetos de esta clase. Este diseño es lógico, ya que el propósito del método virtual es representar los sonidos distintivos que emite cada animal.
Al declarar el método como virtual, se permite que cada subclase implemente su propia versión, capturando la individualidad del sonido de cada animal. Declararlo como virtual puro indica que no existe una implementación por defecto, enfatizando la necesidad de implementaciones concretas en las clases derivadas.
main.cpp
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }
Esto también es lógico. Crear instancias de la Animal
class
sería impráctico y poco intuitivo, ya que representa un concepto abstracto que sirve como categoría para varios animales. No existe un comportamiento específico asociado a un animal genérico, lo que refuerza la naturaleza abstracta de la class
y resalta la importancia de crear subclases especializadas para capturar los sonidos únicos de cada animal específico.
main.cpp
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }
Aunque no es posible crear un objeto del tipo Animal
directamente, aún podemos utilizarlo como parámetro en una función. De manera similar al ejemplo anterior del botón, este enfoque aprovecha el polimorfismo para crear un programa versátil que puede modificar su comportamiento dinámicamente en tiempo de ejecución.
Intente pasar un objeto de una class
diferente a la función y observe la salida. Además, intente crear un objeto de la class
abstracta para ver cómo el compilador impide la instanciación debido a métodos virtuales puros no implementados.
¡Gracias por tus comentarios!