c言語virtualキーワード

1312 ワード

クラスBaseにVirtualキーワードを付けた関数が仮想関数(例えば関数print)であることはC++を学んだことのある人なら誰でも知っているので、Baseの派生クラスDerivedでは仮想関数を書き換えることでベースクラス仮想関数の上書きを実現することができる.ベースクラスBaseのポインタpointが派生クラスDerivedのオブジェクトを指す場合、pointのprint関数の呼び出しは実際にはBaseのprint関数ではなくDerivedのprint関数を呼び出します.これはオブジェクト向けの多態性の体現である.class Base { public:Base(){} public:
   virtual void print(){cout<<"Base";}

};
class Derived:public Base { public:Derived(){} public:
   void print(){cout<<"Derived";}

};
int main() {
   Base *point=new Derived();
   point->print();

}Output:Derivedこれは関数のリロードを連想させるかもしれませんが、少し比較すると両者は完全に異なることがわかります:(1)リロードされたいくつかの関数は同じクラスにある必要があります.上書きされた関数は、継承関係のある異なるクラス(2)で上書きされたいくつかの関数は、関数名、パラメータ、戻り値が同じでなければならない.再ロードされる関数は、パラメータが異なる関数名が同じでなければなりません.パラメータの異なる目的は,関数呼び出し時にコンパイラがパラメータによってプログラムが呼び出している関数を判断できるようにすることである.これは、なぜ関数が戻り値の違いで再ロードできないのかを自然に説明します.プログラムが関数を呼び出すときに戻り値に関心を持たない可能性が高いため、コンパイラはコードからプログラムが呼び出されている関数を見ることができません.(3)上書きされた関数の前にキーワードVirtualを付けなければならない.リロードとVirtualには何の関係もなく、加算しても加算してもリロードの動作には影響しません.(4)派生クラスの関数がベースクラスの関数と同名であるがパラメータが異なる場合.この場合、virtualキーワードの有無にかかわらず、ベースクラスの関数は非表示になります(リロードと混同しないように注意).(5)派生クラスの関数がベースクラスの関数と同名でパラメータも同じであるが,ベースクラスの関数にはvirtualキーワードがない.このとき、ベースクラスの関数は非表示になります(上書きと混同しないように注意してください)