[解決済み] 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*
に暗黙のうちに変換され、その操作は明確に定義されます。
より一般的には、関数の戻り値の型はそのシグネチャの一部とみなされることはありません。戻り値の型が共変である限り、任意の戻り値型でメンバ関数をオーバーライドすることができます。
関連
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] 抽象メソッドと仮想メソッドの違いは何ですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] 派生クラス関数から親クラス関数を呼び出すには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む