[解決済み] virtual、override、またはその両方のキーワードを使用する必要がありますか?
質問
ここ数週間、私の頭を悩ませていることがあります。
virtual
と
override
.
仮想関数で継承を行う場合は、仮想関数内に
virtual
で、コンパイラに正しい関数を検索するように知らせるのです。
その後、c++ 11には新しいキーワードがあることも知りました。
override
. 今、私は少し混乱しています。
それとも、どちらか一方だけで良いのでしょうか?
自分自身を説明するために - 私が何を意味するのかのコード例。
class Base
{
public:
virtual void print() const = 0;
virtual void printthat() const = 0;
virtual void printit() const = 0;
};
class inhert : public Base
{
public:
// only virtual keyword for overriding.
virtual void print() const {}
// only override keyword for overriding.
void printthat() const override {}
// using both virtual and override keywords for overriding.
virtual void printit() const override {}
};
最適な方法は?
どのように解決するのですか?
関数をオーバーライドする場合、技術的には以下のどちらかを記述する必要はありません。
virtual
または
override
.
元の基底クラス宣言には、キーワード
virtual
を使用して、仮想であることを示します。
派生クラスでは、ベースクラスの関数と同じ型にすることで、関数を仮想化します。
ただし
override
は、意図したオーバーライドが技術的にオーバーライドでない場合にコンパイルエラーを発生させ、バグを回避するのに役立ちます。例えば、関数の型がベースクラスの関数と全く同じでない場合です。あるいは、ベースクラスのメンテナンスで関数の型が変更された場合、例えばデフォルトの引数が追加された場合などです。
同じように
virtual
キーワードを使用することで、その関数がさらに派生したクラスでも仮想的であることを保証し、そのようなバグをより微妙なものにすることができます。
というわけで、一般的なアドバイスとしては
-
使用する
virtual
をベースクラス関数の宣言に使用します。
これは技術的に必要です。 -
使用方法
override
(派生クラスのオーバーライドの場合のみ)。
これはメンテナンスに役立ちます。
例
struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };
注意事項
¹ C++ は、共変量生ポインターと生参照の結果をサポートしています。共変量では、オーバーライドの型はまったく同じではありません。ただ、互換性のある型を持つだけです。
関連
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] noexceptを本当に使うべきはいつですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み】「override」キーワードは、オーバーライドされた仮想メソッドをチェックするだけのものですか?