class A { shape s; }

class X : A;
class Y : A;
…

vector<A *> v;
v.push_back(new X);
v.push_back(new Y);
…

vector<pair<A*,A*>> w;
syoutotsu_hantei(v, w);

FOREACH(i, w){
A* s = i->first;
A* t = i->second;
s->on_syoutotsu(t);
t->on_syoutotsu(s);
}

抽象化してるとこのon_syoutotsuを書くのめちゃくちゃだるいやん
dynamic_castかtypeidかダブルディスパッチかあるいは独自の型判定処理か
いずれにしてもクラス数の二乗のコードを書かないといけないから真面目に書いてると過労死するよ