Sobrescrita de Função em C++ Explicada – Exemplos Práticos e Boas Práticas
Sobrescrita de Função em C++ Explicada
Este guia desmistifica a sobrescrita de função em C++, fornecendo exemplos claros, boas práticas e um passo a passo que um desenvolvedor C++ experiente usaria em produção.
Por Que a Sobrescrita de Função Importa
Na programação orientada a objetos, a herança permite que uma classe derivada estenda ou modifique o comportamento de uma classe base. Quando a mesma função membro é declarada tanto na classe base quanto na derivada, a implementação da derivada "sobrescreve" a da base. Quando você chama essa função através de um objeto da classe derivada, a versão sobrescrita é executada.
Exemplo 1: Sobrescrita Básica
#include <iostream> using namespace std; class Base { public: void print() { cout << "Função Base" << endl; } }; class Derived : public Base { public: void print() { cout << "Função Derivada" << endl; } }; int main() { Derived d; d.print(); return 0; }
Saída
Função Derivada
Chamar print() em uma instância Derived executa a função sobrescrita, não a versão da base.

Se você criar um objeto Base e chamar print(), verá a implementação original da base.
Base b; b.print(); // Saída: Função Base
Acessando a Função Base Sobrescrita
Às vezes, você precisa invocar a versão da classe base explicitamente. Duas técnicas comuns são:
- Usar o operador de resolução de escopo
::. - Empregar um ponteiro de classe base que aponte para um objeto derivado (quando a função não é virtual).
Exemplo 2: Resolução de Escopo para Chamar Função Base
#include <iostream> using namespace std; class Base { public: void print() { cout << "Função Base" << endl; } }; class Derived : public Base { public: void print() { cout << "Função Derivada" << endl; } }; int main() { Derived d1, d2; d1.print(); d2.Base::print(); // Chamada explícita a Base::print return 0; }
Saída
Função Derivada Função Base
Exemplo 3: Chamando Função Base de Dentro da Derivada
#include <iostream> using namespace std; class Base { public: void print() { cout << "Função Base" << endl; } }; class Derived : public Base { public: void print() { cout << "Função Derivada" << endl; Base::print(); // Invocar versão base } }; int main() { Derived d; d.print(); return 0; }
Saída
Função Derivada Função Base
Exemplo 4: Usando Ponteiro Base para Acessar Função Base
#include <iostream> using namespace std; class Base { public: void print() { cout << "Função Base" << endl; } }; class Derived : public Base { public: void print() { cout << "Função Derivada" << endl; } }; int main() { Derived d; Base* ptr = &d; // Ponteiro para Base apontando para objeto Derived ptr->print(); // Chama Base::print porque a função não é virtual return 0; }
Saída
Função Base
Quando a função não é declarada virtual, um ponteiro de classe base invoca a implementação da base. Para obter comportamento polimórfico verdadeiro, declare a função base como virtual e sobrescreva-a na classe derivada.
Esses exemplos ilustram a mecânica da sobrescrita de função em C++. Dominando esses conceitos, você pode escrever código mais limpo e sustentável que aproveita o polimorfismo efetivamente.
Linguagem C
- Dominando Operadores em C++: Guia Completo com Exemplos Práticos
- Comentários em C++: Boas Práticas para Código Legível e Manutenível
- Como Passar Arrays para Funções em C++: Guia Prático
- Funções em C++ Explicadas com Exemplos Práticos de Código
- Dominando Funções em C: Estrutura, Declaração e Boas Práticas
- Linguagem de Programação C++: Visão Geral e Principais Características
- Constantes e Literais em C++: Tipos, Sintaxe e Boas Práticas
- Guia Completo de Operadores em C++: Tipos, Uso e Boas Práticas
- Dominando Tipos Numéricos em C++: Guia Prático
- Dominando Sobrecarga em C++: Funções e Operadores Explicados