もうひとつ。
メソッドをオーバーライドすると、同じ関数名は全てオーバーロードが必要ですか?
#include <iostream>
using namespace std;

class Animal {
public:
  void speak(int n);
  void speak(){cout<<"ギャー";}
};
void Animal::speak(int n){
  for( ; n>0; n--)
    speak();
}

class Dog : public Animal {
public:
  void speak(){cout<<"ワン";}
};

int main(void) {
  Dog dog;
// dog.speak(2);
  dog.speak();
}