Última actualización:2026-10-12
Funciones virtuales puras y clases abstractas en C++¶
Sobre el autor:¶
Cuenta pública personal de WeChat:

1. Funciones virtuales puras y clases abstractas¶
Una función virtual pura (o función abstracta) en C++ es una función virtual que no implementamos. ¡Solo la declaramos! Una función virtual pura se declara asignando 0 en su declaración.
* Función virtual pura: una función virtual sin cuerpo de función. * Clase abstracta: una clase que contiene funciones virtuales puras.Una clase abstracta solo puede utilizarse como clase base para derivar nuevas clases; no se pueden crear objetos de una clase abstracta, y los punteros y referencias a la clase abstracta -> deben apuntar a objetos de clases derivadas de la clase abstracta.
Ejemplos de código: abstract_base.h y pure_virtual.cpp
2. Implementar una clase abstracta¶
Dentro de una clase abstracta: en las funciones miembro se puede llamar a una función virtual pura, pero dentro del constructor/destructor no se puede utilizar una función virtual pura.
Si una clase deriva de una clase abstracta, debe implementar todas las funciones virtuales puras de la clase base para poder convertirse en una clase no abstracta.
// A为抽象类
class A {
public:
virtual void f() = 0; // 纯虚函数
void g(){ this->f(); }
A(){} // 构造函数
};
class B : public A{
public:
void f(){ cout<<"B:f()"<<endl;} // 实现了抽象类的纯虚函数
};
Ejemplo de código: abstract.cpp
3. Puntos importantes¶
-
Una función virtual pura convierte una clase en una clase abstracta
-
El constructor no puede ser virtual, mientras que el destructor sí puede ser un destructor virtual
// 抽象类 class Base { public: Base(){ cout << "Constructor: Base" << endl; } virtual ~Base(){ cout << "Destructor : Base" << endl; } virtual void func() = 0; }; class Derived: public Base { public: Derived(){ cout << "Constructor: Derived" << endl; } ~Derived(){ cout << "Destructor : Derived" << endl;} void func(){cout << "In Derived.func()." << endl;} };Cuando un puntero a la clase base apunta a un objeto de la clase derivada y se elimina el objeto, puede que queramos que se llame al destructor apropiado. Si el destructor no es virtual, solo se llamará al destructor de la clase base.
4. Ejemplo completo¶
¡Las clases abstractas se implementan a través de la herencia por parte de las clases derivadas!
Ejemplo de código: derived_full.cpp
Temas relacionados¶
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事
- C++ restrict y optimización del compilador | C++那些事