16 9月 2016
16 9月 2016
class CFoo final { //--- クラス本体 }; class CBar : public CFoo { //--- クラス本体 };final修飾子を使用したクラスからの継承を試行すると、上記の例で示したように、コンパイルはエラーを出します。
class CFoo { void virtual func(int x) const { } };次にメソッドを派生クラスでオーバーライドします:
class CBar : public CFoo { void func(short x) { } };しかしエラーによって引数の型がintからshortに変わります。実際には、このような場合、オーバーライドではなくメソッドのオーバーロードが起こります。オーバーロードされた関数定義のアルゴリズムに従い、特定のケースにおいてコンパイラがオーバーライドされたメソッドの代わりに基底クラスで定義されたメソッドを選択することがあります。
class CBar : public CFoo { void func(short x) override { } };オーバーライド時にメソッドシグネチャが変更された場合、コンパイラは親クラスで全く同じシグネチャを見つけることができず、コンパイルエラーを出します。
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };final修飾子を使用したメソッドのオーバーライドを試行すると、上記の例で示したように、コンパイルはエラーを出します。
ドキュメントが更新されました。