vector<auto *> g_wnd_bases;
vector<auto *> g_icon_havings;

add_wnd_base( auto *wnd_base ){ push_back( &g_wnd_bases, wnd_base ); }
add_icon_having( auto *icon_having ){ push_back( &g_icon_havings, icon_having ); }

void update()
{
  //for_eachの仕様は適当。まだ定まってないからな。擬似言語。
  for_each( g_wnd_bases ){ f( _1 ); }
  for_each( g_icon_havings ){ g( _1 ); }
}

ほらよ。

g_wnd_basesに突っ込まれりゃ「f」が呼ばれるし、
g_icon_havingsに突っ込まれりゃ「g」が呼ばれる。
ただそれだけ。対応するfやgが無きゃリンクエラーだ。
いたって単純。

継承がどうとかいちいち考えるから、頭がおかしくなるんだ。

ところで、型値はポインタ宣言ごとのローカルなものなんだけど、
ポインタからポインタへの代入時は当然型値の変換も行うんだぜ。
そりゃローカルからローカルだから、変換は必要だ罠。
だから、それ用のテーブルも作る。
グローバルな型値も、動的モジュールのロードに備えて、裏では持つだろうけど、
現段階ではポインタには持たせないつもり。