1. ホーム
  2. c++

[解決済み] C++仮想関数の戻り値型

2023-05-14 21:33:13

質問

継承したクラスが、異なる戻り値の型(戻り値としてテンプレートを使用しない)を持つ仮想関数を実装することは可能でしょうか?

どのように解決するのですか?

派生クラスが異なる戻り値の型を使用して仮想関数をオーバーライドすることは、場合によっては合法です。 共変量 である限り、派生クラスが異なる戻り値を持つ仮想関数をオーバーライドすることは合法です。 例えば、次のように考えてみましょう。

class Base {
public:
    virtual ~Base() {}

    virtual Base* clone() const = 0;
};

class Derived: public Base {
public:
    virtual Derived* clone() const {
        return new Derived(*this);
    }
};

ここで Base という純粋仮想関数を定義しています。 clone を返す Base * . 派生実装では、この仮想関数は戻り値の型を Derived * . この戻り値の型はベースと同じではありませんが、これは完全に安全です。

Base* ptr = /* ... */
Base* clone = ptr->clone();

の呼び出しは clone() へのポインタを返します。 Base オブジェクトへのポインタを返します。 Derived* を返したとしても、このポインタは暗黙のうちに Base* に暗黙のうちに変換され、その操作は明確に定義されます。

より一般的には、関数の戻り値の型はそのシグネチャの一部とみなされることはありません。戻り値の型が共変である限り、任意の戻り値型でメンバ関数をオーバーライドすることができます。