web-dev-qa-db-ja.com

非仮想関数のオーバーライド

それが言うC++ 11 FDIS

仮想関数がvirt-specifierオーバーライドでマークされていて、基本クラスのメンバー関数をオーバーライドしていない場合、プログラムは不正な形式です。 [例:

struct B {
    virtual void f(int);
};
struct D : B {
    void f(long) override; // error: wrong signature overriding B::f
    void f(int) override; // OK
};

- 仮に B::fは仮想とマークされていなかったのでしょうか?それでは、プログラムの形式は正しくありませんか?またはoverrideは無視されます `。 stdテキストでこのケースの処理を見つけることができません。

1/2を更新(マージ)物事を調べるためにC++エディタにリクエストを転送しました。それを私に指摘してくれてありがとうJohannes.

  • "void f(long) override"は関数をオーバーライドしません。特に仮想関数はありません。
  • したがって、それは仮想ではありません
  • したがって、「仮想関数が...でマークされている場合」というテキストは適用されません。
  • したがって、例はテキストと一致しません。

しかし、これを実現すると、「オーバーライド」コンテキストキーワードの意図が満たされなくなることがわかります。関数名のタイプミスまたは誤った引数タイプが関数自体を非仮想にすると、標準のテキストは適用されません- -「オーバーライド」は役に立たなくなります。

最善の解決策は

  • 例の関数の前に「仮想」を置く
29
towi

仮に B::fは仮想としてマークされていませんでしたか?それでは、プログラムの形式は間違っていますか?

はい、そうです。 override何かにするために、その何かはto仮想である。それ以外の場合はoverridingではなく、hiding。したがって、あなたの質問の引用から肯定的な答えが得られます。

28
Armen Tsirunyan

B:fは非仮想だったので、-両方D:f関数の形式が正しくありません。

0

はい、overrideを非仮想関数に追加すると、プログラムの形式が正しくありません。

一般に、シグネチャが異なる(オーバーロードされた)関数は、名前が異なる関数と同じように異なります。仕様に示されている例は、関数名がoverrideに影響することを意味するものではありません。これは、overrideが防止するように設計されている一般的なエラーを示すことを目的としています。

0
deft_code