以下のコードに関するコンパイラ エラーについて混乱しています。
class Base {
public:
  virtual ~Base () { }
  virtual void func () { }
  virtual void func (int) { }
  virtual void another () { }
  virtual void another (int) { }
};
class Derived : public Base {
public:
  void func () { }
};
int main () {
  Derived d;
  d.func();
  d.func(0);
  d.another();
  d.another(0);
}
gcc 4.6.3 を使用すると、上記のコードは d.func(0) で、Dervied::func(int) が未定義であるというエラーを引き起こします。
func(int) の定義も Derived に追加すると、機能します。Derived で func() も func(int) も定義していない場合にも機能します (「別の」場合のように)。
明らかに、仮想オーバーロードされた関数に関していくつかの規則がここで行われていますが、これに遭遇したのはこれが初めてで、よくわかりません。誰かがここで何が起こっているのか正確に教えてもらえますか?