関数を書き換えるときは、次の注意事項に従う必要があります: 関数のシグネチャは基本クラスのアクセス修飾子より厳密にすることはできません。書き換えには仮想関数のみを含めることができます。基本クラス関数と複数の書き換えがあり、書き換えるつもりはありません。オーバーライドを正しく使用し、予期しない動作を回避するための落とし穴を考慮してください。
#C 関数書き換えの注意事項と落とし穴
オブジェクト指向プログラミングにおける関数書き換えとは、サブクラス化を指します。基本クラス内の同じ名前の関数。これは強力なメカニズムですが、使用方法を誤ると落とし穴がある可能性があります。
注:
- #関数のシグネチャは同じである必要があります:オーバーライドされた関数には、同じパラメーター リストと同じパラメーターが必要です。 list を基本クラス関数の戻り値の型として使用します。
- アクセス修飾子はこれ以上厳密にすることはできません: サブクラス関数のアクセス修飾子は、基本クラス関数のアクセス修飾子よりも厳密にすることはできません。たとえば、基本クラス関数がパブリックである場合、サブクラス関数を保護またはプライベートにすることはできません。
- const または override: const または override キーワードを使用して、関数が新しい関数を追加する代わりに基本クラス関数をオーバーライドすることを明確に示します。
- 仮想関数: 仮想関数のみをオーバーライドできます。基本クラス関数は、virtual キーワードを使用して virtual として宣言できます。
トラップ:
- 基本クラス関数を非表示にする: サブクラス関数のシグネチャが基本関数と同じ場合class 関数ですが、アクセス修飾子はより寛容で、基本クラス関数をオーバーライドするのではなく非表示にします。
- 複数のオーバーライド: 関数は 1 つのサブクラス内でのみオーバーライドできます。複数のサブクラスが同じ関数をオーバーライドしようとすると、コンパイラはエラーを報告します。
- 意図しないオーバーライド: サブクラス関数が基本クラス関数と同じシグネチャを持っていても、実際にはそれをオーバーライドすることが意図されていない場合、予期しない動作が発生する可能性があります。
実際的なケース:
次の基本クラスとサブクラスの例を考えてみましょう:
class Base {
public:
virtual void print() const {
std::cout << "Base::print() called" << std::endl;
}
};
class Derived : public Base {
public:
void print() const override {
std::cout << "Derived::print() called" << std::endl;
}
};
ここでは、派生クラスが基本クラスをオーバーライドします。 print() 関数を実行すると、サブクラス関数は基本クラス関数を正しくオーバーライドし、別のメッセージを出力します。
落とし穴を避けるためのヒント:
const または override を明示的に使用して、オーバーライドを示します。 - アクセス修飾子が正しいかどうかを確認してください。
- 関数をオーバーライドする場合は、必ず関数をオーバーライドするようにしてください。
- 偶発的なオーバーライドを避けるために、関数のシグネチャを注意深く確認してください。
-
以上がC++ 関数書き換えの注意点と落とし穴の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。