次のコードを検討してください
class X{
public:
virtual void foo(X x){ }
virtual void foo(int index){ }
};
class Y : public X{
public:
void foo(int index){ }
};
int main(){
Y y;
y.foo(X()); //Error, see below
}
クラスXが仮想fooメソッドをオーバーロードしました。1つのバージョンはを取り、Xもう1つのバージョンはを取りますint。これで、クラスはメソッドYを継承しXてオーバーライドしますfoo(int)。メソッドfoo(X)はオーバーライドされません。同じままである必要があります。
Yただし、メソッドで型のオブジェクトを作成してmainを呼び出すfoo(X)と、コンパイラは次のように文句を言います。
In function ‘int main()’:
error: no matching function for call to ‘Y::foo(X)’
note: candidate is:
note: virtual void Y::foo(int)
note: no known conversion for argument 1 from ‘X’ to ‘int’
したがって、唯一の候補はオーバーライドされたfoo(int)メソッドです。他の方法は単に消えたようです。オーバーライドするバージョンを削除すると、つまり、Yとして宣言するとpublic Y : public X{};、すべてが正常に機能します。なぜこれが起こるのですか?