たとえば、純粋な仮想関数を持つ基本クラスがあります。
class IBase
{
virtual void Function(const IBase& ref) = 0;
};
クラスを継承する場合、派生クラスをパラメーターとして受け取る「関数」をオーバーロードする必要がありますか?
class Derived
{
// this will be implemented
virtual void Function(const IBase& ref) {}
// does this have to be implemented
virtual void Function(const Derived& ref) {}
};
または、コンパイラは呼び出しを区別でき、オーバーロード関数の記述をスキップできますか?
Derived d();
...
IBase* dptr = &d; // ignoring cast for example
// would never really call 'Function' on itself, this is for example purposes
dptr->Function(d);
注: IBase::Function は、ポインター型ではなく、参照型を取る必要があります。
純粋仮想関数を継承するルールは理解していますが、純粋仮想関数が基本型をパラメーターとして受け取るこの特別なケースは理解していません。
私が知る必要があるのは、継承された型をパラメーターとして受け取る各継承された型にオーバーロードを実装する必要があるか、または派生参照を渡すと仮想実装を呼び出すことをコンパイラーが理解するかということです。