C での異なる戻り型の仮想関数のオーバーライド
C の仮想関数の重要な機能の 1 つは、それらを C でオーバーライドできることです。特殊な実装を提供する派生クラス。ただし、オーバーライドする関数で別の戻り値の型を使用できるかどうかは必ずしも明確ではありません。
ほとんどの場合、戻り値の型が特定の制約に準拠している限り、答えは はい です。具体的には、戻り値の型は元の戻り値の型と 共変 である必要があります。共分散とは、オーバーライドする関数の戻り値の型が、元の戻り値の型のサブタイプであるか、元の戻り値の型に暗黙的に変換可能である必要があることを意味します。
次の例を考えてみましょう。
class Base { public: virtual ~Base() {} virtual Base* clone() const = 0; // pure virtual function }; class Derived: public Base { public: virtual Derived* clone() const { return new Derived(*this); } };
この例では、基本クラスは、Base* を返す純粋な仮想関数のクローンを定義します。 Derived クラスはクローンをオーバーライドし、Derived* を返します。これが許可されるのは、 Derived* が Base* のサブタイプであるためです。
一般に、関数の戻り値の型は、C ではそのシグネチャの一部とはみなされません。したがって、共分散ルールを満たす限り、任意の戻り値の型でメンバー関数をオーバーライドできます。これにより、派生クラスは、契約要件に違反することなく、より具体的な仮想関数の実装を提供できるようになります。
以上がC 仮想関数を異なる戻り値の型でオーバーライドできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。