Есть два проявления полиморфизма - перегрузка и переопределение. Полагаю с первым вы уже сталкивались. Вот пример переопределения на C++:
#include <iostream>
#include <memory>
using namespace std;
struct Base {
virtual void Action() = 0;
};
struct A: public Base {
virtual void Action() override { cout<< 'A'; }
}
struct B: public Base {
virtual void Action() override { cout<< 'B'; }
}
int main() {
// Используем общий интерфейс для разных наследников
unique_ptr<Base> ptr = make_unique<A>();
ptr->Action(); // A
ptr = make_unique<B>();
ptr->Action(); // B
}