当然,両方ともオーバーライドをしないといけません。
オーバーロードされた関数である以上,最終的には似たような動作を行うのが普通です。
オフトピック
典型例は,引数の一部が省略されていて,省略部分にはデフォルト値が設定されるような場合。
オーバーロードされた関数が全く異なる動作をするのであれば,そもそも別名をつけないと使う側が混乱します。
なので,全引数入りの純粋仮想関数を用意しておいて,残りの関数はデフォルトの設定としてその全引数入りの関数を呼ぶような作りにします。
こうすることで,通常は一つの仮想関数のオーバーライドで実装が済み,効率等の問題で特定の引数の組み合わせの場合だけ別のコードで実行したい,というようなことを処理できます。
コード:
class foo {
protected:
virtual int funcImpl (int p1, const std::string & p2) = 0;
public:
virtual int func () { return funcImpl(0, ""); }
virtual int func (int p) { return funcImpl(p, "");}
virtual int func (const std::string & p) { return funcImpl(0, p); }
};