1

たとえば、純粋な仮想関数を持つ基本クラスがあります。

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 は、ポインター型ではなく、参照型を取る必要があります。

純粋仮想関数を継承するルールは理解していますが、純粋仮想関数が基本型をパラメーターとして受け取るこの特別なケースは理解していません。

私が知る必要があるのは、継承された型をパラメーターとして受け取る各継承された型にオーバーロードを実装する必要があるか、または派生参照を渡すと仮想実装を呼び出すことをコンパイラーが理解するかということです。

4

2 に答える 2

2

はい、Function(const IBase&)基本クラスに があり、派生クラスでそれをオーバーライドする場合、派生クラスへの参照を に渡すことができ、FunctionFunction(const IBase&)呼び出されます。

于 2012-10-01T02:49:13.853 に答える
2

私が知る必要があるのは、継承された型をパラメーターとして受け取る各継承された型にオーバーロードを実装する必要があるか、または派生参照を渡すと仮想実装を呼び出すことをコンパイラーが理解するかということです。

基本型で定義された関数のみをオーバーライドし、オーバーロードを追加しない場合、コンパイラは のすべてのインスタンスを変換しDerivedIBase既存の関数を呼び出します。

于 2012-10-01T03:18:00.880 に答える