ビデオ: C++プログラミング言語入門講座4巻1章オブジェクト指向【動学.tv】4/4 2024
C ++では、特定の関数呼び出しが遅れていると考えるからといって、それがそのことを意味するわけではありません。サブクラスで同じ引数で宣言されていない場合、メンバー関数は仮想宣言されているかどうかに関わらず、多態的にオーバーライドされません。同一の宣言規則に対する1つの例外は、基本クラスのメンバ関数が基本クラスオブジェクトへのポインタまたは参照を返す場合、そのサブクラスのオーバーライドされたメンバ関数がポインタまたはサブクラスのオブジェクトへの参照を返す可能性がある。言い換えれば、関数makeACopy()は、2つの関数の戻り値の型が異なる場合でも、多態性です。
<! - 1 - >
クラスBase {public://現在のオブジェクトのコピーを返します。Base * makeACopy();};クラスSubClass:public Base {public://現在のオブジェクトのコピーを返します。SubClass * makeACopy();}; void fn(Base&bc){Base * pCopy = bc。 makeACopy(); // proceed on …}実際には、これはかなり自然です。 makeACopy()関数は、BaseClass:::makeACopy()
をオーバーライドする場合でも、SubClass 、 型のオブジェクトを返さなければなりません。
オーバーライド が導入されました。 <!関数がオーバーライド宣言されているにもかかわらず、実際には、次の例のような何らかの理由で(何らかの理由で)基底クラス関数をオーバーライドしない場合、コンパイラエラーが発生します。 > <! - 3 - >
クラス学生{public:virtual void addCourseGrade(double grade);};クラスGradStudent:public Student {public:virtual void addCourseGrade(float grade);};このスニペットは、メソッドGradStudent::addCourseGrade(float)がオーバーライド宣言されているためコンパイル時エラーを生成しますが、実際には基本クラス関数Student::addCourseGrade(double)をオーバーライドしません。 tマッチ。
<!プログラマは、最後の
キーワードを使って関数を宣言することもできます。ただし、その関数自体がいくつかの以前の基底クラス関数をオーバーライドしていても、
> PostDocクラス: クラスGradStudent:public Student {public:virtual void addCourseGrade(double grade)final;}; PostDocクラス:public GradStudent {public:virtual void addCourseGrade(double grade);}; Student:: addCourseGrade()は 、 PostCore::addCourseGrade()の宣言は Student
メソッドをオーバーライドしようとするため、エラーを生成します。