Sobreescritura de funciones en C++ explicada: ejemplos prácticos y mejores prácticas
Sobreescritura de funciones en C++ explicada
Esta guía desmitifica la sobreescritura de funciones en C++, proporcionando ejemplos claros, mejores prácticas y un recorrido paso a paso que un desarrollador experimentado en C++ usaría en producción.
Por qué importa la sobreescritura de funciones
En la programación orientada a objetos, la herencia permite que una clase derivada extienda o modifique el comportamiento de una clase base. Cuando la misma función miembro se declara tanto en la clase base como en la derivada, la implementación derivada "sobreescribe" a la base. Cuando llama a esa función a través de un objeto de la clase derivada, se ejecuta la versión sobreescrita.
Ejemplo 1: Sobreescritura básica
#include <iostream>
using namespace std;
class Base {
public:
void imprimir() {
cout << "Función Base" << endl;
}
};
class Derivada : public Base {
public:
void imprimir() {
cout << "Función Derivada" << endl;
}
};
int main() {
Derivada d;
d.imprimir();
return 0;
}
Salida
Función Derivada
Llamar a imprimir() en una instancia de Derivada ejecuta la función sobreescrita, no la versión base.

Si crea un objeto Base y llama a imprimir(), verá la implementación original de la base.
Base b; b.imprimir(); // Salida: Función Base
Accediendo a la función base sobreescrita
A veces necesita invocar la versión de la clase base explícitamente. Dos técnicas comunes son:
- Usar el operador de resolución de ámbito
::. - Emplear un puntero a clase base que apunte a un objeto derivado (cuando la función no es virtual).
Ejemplo 2: Resolución de ámbito para llamar a función base
#include <iostream>
using namespace std;
class Base {
public:
void imprimir() {
cout << "Función Base" << endl;
}
};
class Derivada : public Base {
public:
void imprimir() {
cout << "Función Derivada" << endl;
}
};
int main() {
Derivada d1, d2;
d1.imprimir();
d2.Base::imprimir(); // Llamada explícita a Base::imprimir
return 0;
}
Salida
Función Derivada Función Base
Ejemplo 3: Llamar a función base desde dentro de la derivada
#include <iostream>
using namespace std;
class Base {
public:
void imprimir() {
cout << "Función Base" << endl;
}
};
class Derivada : public Base {
public:
void imprimir() {
cout << "Función Derivada" << endl;
Base::imprimir(); // Invocar versión base
}
};
int main() {
Derivada d;
d.imprimir();
return 0;
}
Salida
Función Derivada Función Base
Ejemplo 4: Usar puntero base para acceder a función base
#include <iostream>
using namespace std;
class Base {
public:
void imprimir() {
cout << "Función Base" << endl;
}
};
class Derivada : public Base {
public:
void imprimir() {
cout << "Función Derivada" << endl;
}
};
int main() {
Derivada d;
Base* ptr = &d; // Puntero a Base apuntando a objeto Derivada
ptr->imprimir(); // Llama a Base::imprimir porque la función no es virtual
return 0;
}
Salida
Función Base
Cuando la función no se declara virtual, un puntero a clase base invoca la implementación base. Para lograr comportamiento polimórfico real, declare la función base como virtual y sobreescríbala en la clase derivada.
Estos ejemplos ilustran la mecánica de la sobreescritura de funciones en C++. Al dominar estos conceptos, puede escribir código más limpio y mantenible que aproveche el polimorfismo efectivamente.
Lenguaje C
- Dominando los Operadores en C++: Guía Completa con Ejemplos Prácticos
- Comentarios en C++: Mejores Prácticas para Código Legible y Mantenible
- Cómo Pasar Arrays a Funciones en C++: Guía Práctica
- Funciones en C++ Explicadas con Ejemplos de Código Prácticos
- Dominando funciones en C: Estructura, declaración y mejores prácticas
- Lenguaje de Programación C++: Visión General y Características Clave
- Constantes y Literales en C++: Tipos, Sintaxis y Mejores Prácticas
- Guía Completa de Operadores en C++: Tipos, Uso y Mejores Prácticas
- Dominando los Tipos Numéricos en C++: Guía Práctica
- Dominando la Sobrecarga en C++: Funciones y Operadores Explicados
- Entendiendo el Polimorfismo en C++: Guía Práctica