次のコードを検討してください
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{};
、すべてが正常に機能します。なぜこれが起こるのですか?