Clases abstractas y métodos virtuales puros
Defina interfaces con métodos virtuales puros y haga cumplir los contratos de las clases derivadas.
Clases abstractas y métodos virtuales puros es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué es una clase abstracta?
Una clase abstracta tiene al menos una función puramente virtual, declarada con = 0. No puede instanciarla directamente.
class Animal {
public:
virtual void speak() const = 0; // pure virtual
virtual ~Animal() = default;
};
// Animal a; // ERROR: cannot instantiateFunciones puramente virtuales
= 0 indica que una función no tiene una implementación predeterminada. Las clases derivadas deben sobrescribirla antes de que se pueda instanciar la clase.
Implementación de la interfaz
Las clases derivadas proporcionan cuerpos concretos para todas las funciones puramente virtuales.
class Dog : public Animal {
public:
void speak() const override {
std::cout << "Woof!\n";
}
};
Dog d;
d.speak(); // Woof!Clases abstractas como interfaces
Una clase abstracta que solo tiene métodos puramente virtuales y ningún miembro de datos actúa como una interfaz en otros lenguajes.
class Drawable {
public:
virtual void draw() const = 0;
virtual ~Drawable() = default;
};Combinación de implementación e interfaz
Las clases abstractas pueden tener tanto métodos puramente virtuales como métodos concretos. Las funciones puramente virtuales definen el contrato; los métodos concretos proporcionan un comportamiento compartido.
class Logger {
public:
void logInfo(const std::string& msg) { log("INFO", msg); }
void logError(const std::string& msg) { log("ERROR", msg); }
protected:
virtual void log(const std::string& level, const std::string& msg) = 0;
};Función puramente virtual con cuerpo predeterminado
Una función puramente virtual puede tener un cuerpo, lo que resulta útil como implementación predeterminada que las clases derivadas pueden invocar.
class Base {
public:
virtual void f() = 0;
};
void Base::f() {
std::cout << "default behavior\n";
}
class Derived : public Base {
public:
void f() override {
Base::f(); // call the default
std::cout << "extra\n";
}
};Uso mediante punteros y referencias
El código polimórfico mantiene los objetos abstractos mediante punteros o referencias al tipo base.
void perform(const Animal& a) {
a.speak();
}Almacenamiento en contenedores
Los vectores no pueden contener tipos abstractos por valor. Utilice punteros, normalmente punteros inteligentes.
std::vector<std::unique_ptr<Animal>> zoo;
zoo.push_back(std::make_unique<Dog>());
zoo.push_back(std::make_unique<Cat>());
for (auto& a : zoo) a->speak();Cuándo utilizar clases abstractas
Utilícelas cuando:
- Quiera definir una interfaz común para varias implementaciones no relacionadas
- Necesite un tipo base para contenedores polimórficos
- Quiera inyectar comportamiento mediante subclases (patrón Template Method)
Alternativas: conceptos y plantillas
Para el polimorfismo en tiempo de compilación, los conceptos de C++20 y las plantillas suelen sustituir a las clases abstractas, sin coste en tiempo de ejecución. Utilice funciones virtuales cuando necesite polimorfismo durante la ejecución.
Riesgo: slicing
Pase las clases abstractas por referencia o mediante un puntero. Pasarlas por valor es imposible de todos modos, porque no se puede instanciar un tipo abstracto; además, pasar las clases derivadas por valor produciría slicing.
Comprobación rápida
¿Qué hace que una clase sea abstracta en C++?
Resumen
Las clases abstractas, aquellas que tienen al menos un método puramente virtual, definen interfaces para el código polimórfico. Utilícelas con punteros o referencias, a menudo punteros inteligentes, para enviar el comportamiento durante la ejecución.
Preguntas frecuentes
¿La lección «Clases abstractas y métodos virtuales puros» es gratis?
Sí — el texto completo de «Clases abstractas y métodos virtuales puros» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Clases abstractas y métodos virtuales puros»?
Defina interfaces con métodos virtuales puros y haga cumplir los contratos de las clases derivadas. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Clases abstractas y métodos virtuales puros»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Herencia simple y múltiple
- Funciones virtuales y la vtable
- Clases abstractas y métodos virtuales puros
- Herencia frente a composición: ventajas y desventajas