Как в С++ полиморфно обработать множество объектов унаследованных от некоторого одного
Вот есть у меня несколько объектов, реализующих один интерфейс. И есть необходимость обрабатвать их по разному в некотором классе в зависимости от их типа
#include <iostream>
#include <vector>
class A {};
class B: public A {};
class C: public A {};
class X
{
public:
void x(A* a) { std::cout << "x(A* a) was called\n"; }
void x(B* b) { std::cout << "x(B* a) was called\n"; }
void x(C* c) { std::cout << "x(C* a) was called\n"; }
};
int main()
{
std::vector<A*> vec;
vec.push_back(new B);
vec.push_back(new C);
X* x = new X;
for(A* a: vec) { x->x(a); } //дважды выведет x(A* a) was called\n
return 0;
}
Если мне вперемежку приходит коллекция разных классов унаследованных от A, как мне реализовать уникальное поведение для каждого из этих типов? Запихивать необходимый функционал в сами классы B и C я не могу.