0Pricing
C++ Academy · Lección

Funciones virtuales y la vtable

Implemente polimorfismo en tiempo de ejecución con funciones virtuales y examine el concepto de vtable.

Funciones virtuales y la vtable es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 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.

Enlace estático frente a dinámico

De forma predeterminada, las llamadas a miembros tienen un enlace estático: el compilador elige la función según el tipo declarado. Con funciones virtual, la llamada tiene un enlace dinámico basado en el tipo real.

Declaración de una función virtual

Marque la función como virtual en la clase base. Las clases derivadas pueden sobrescribirla.

class Shape {
public:
    virtual double area() const = 0;        // pure virtual
    virtual ~Shape() = default;
};

class Circle : public Shape {
    double r_;
public:
    Circle(double r) : r_(r) {}
    double area() const override { return 3.14159 * r_ * r_; }
};

El especificador override

Añada override a los métodos derivados. El compilador verifica que la función sobrescriba realmente una función virtual y detecta errores tipográficos en la firma.

El especificador final

final impide sobrescrituras posteriores. Utilícelo en clases de las que no se deba heredar o en métodos que no se deban sobrescribir de nuevo.

class Concrete final : public Base { /* ... */ };
class Base {
    virtual void f() final;   // cannot be overridden
};

Llamadas mediante un puntero a la clase base

Esta es la magia del polimorfismo: un puntero a la clase base puede enviar la llamada al método correcto de la clase derivada.

Shape* s = new Circle(3.0);
std::cout << s->area();   // 28.27... (Circle::area)
delete s;

El concepto de vtable

Cada clase polimórfica tiene una vtable oculta, una tabla de punteros a funciones. Cada objeto contiene un puntero oculto (vptr) a la vtable de su clase.

Coste de las llamadas virtuales

Una llamada virtual añade una indirección a través de la vtable. En la mayoría del código, su coste es insignificante. Evítela en bucles internos si las mediciones muestran que es un cuello de botella.

Funciones puramente virtuales

Añada = 0 para convertir una función en puramente virtual. Las clases derivadas deben sobrescribirla para poder instanciarse. La clase se vuelve abstracta.

Destructores virtuales

Si una clase tiene alguna función virtual o está destinada a eliminarse mediante un puntero a la clase base, proporciónele un destructor virtual. De lo contrario, el destructor de la clase derivada nunca se ejecutará.

class Base {
public:
    virtual ~Base() = default;   // safe to delete through Base*
};

Polimorfismo con punteros inteligentes

Administre los objetos polimórficos mediante punteros inteligentes a la clase base. El puntero inteligente gestiona correctamente la destrucción.

std::unique_ptr<Shape> s = std::make_unique<Circle>(3.0);

Repaso del slicing

Pasar un objeto derivado por valor a una función que espera la clase base elimina la parte derivada. Utilice referencias o punteros para los parámetros polimórficos.

Equilibrio entre rendimiento y flexibilidad

Las funciones virtuales aportan flexibilidad con un pequeño coste en tiempo de ejecución. Las plantillas ofrecen polimorfismo en tiempo de compilación sin coste en tiempo de ejecución; elija según necesite o no polimorfismo durante la ejecución.

Comprobación rápida

¿Por qué debería una clase base polimórfica tener un destructor virtual?

Resumen

Las funciones virtuales permiten el polimorfismo en tiempo de ejecución mediante una vtable por clase. Marque las sobrescrituras con override e impida herencias posteriores con final. Proporcione siempre un destructor virtual a las clases base polimórficas.

Preguntas frecuentes

¿La lección «Funciones virtuales y la vtable» es gratis?

Sí — el texto completo de «Funciones virtuales y la vtable» 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 «Funciones virtuales y la vtable»?

Implemente polimorfismo en tiempo de ejecución con funciones virtuales y examine el concepto de vtable. 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 2 de 4.

¿Cuánto tiempo toma la lección «Funciones virtuales y la vtable»?

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

  1. Herencia simple y múltiple
  2. Funciones virtuales y la vtable
  3. Clases abstractas y métodos virtuales puros
  4. Herencia frente a composición: ventajas y desventajas
← Volver a C++ Academy