まず、新しい知識ポイントである仮想関数を紹介しましょう。
これはどのような機能ですか?簡単に言うと、関数の前に virtual を付けて宣言した関数です。一般的な形式は次のとおりです。
仮想関数の戻り値 関数名(仮引数) {関数本体}
それで、それは何に使われるのでしょうか?仮想関数の出現により、関数と関数本体の間の接続が実行時に確立されます。これは、いわゆる動的バインディングです。次に、仮想関数の派生クラスが実行されているときに、実行時の動的バインディング (いわゆるポリモーフィズム) に従って、同じメソッドを実行しても異なる結果が得られるという効果を実現できます。このようにして、前節の問題を解決する方法があります。
次に、基本クラスの area メソッドを仮想関数として宣言するだけで済みます。その後、main 関数内の Point 型のポインターまたは参照を大胆に呼び出すことができ、型の問題を心配する必要はありません。なぜなら、動的バインディングを実現するために、実際のオブジェクト型に基づいてどのメソッドを呼び出すかを決定するからです。
コードは次のとおりです。
/************************************//デス: C++ チュートリアル デモ//作成者: Huang/ /著作権:www.dotcpp.com//日付:2017/12/20********************************* *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
変更後、次のようにコンパイルして実行します。
ご自身のコンピュータで実験して、仮想関数とポリモーフィズムの役割を体験してください。
注意すべき点は次のとおりです。
1. 仮想関数はオブジェクトに属していないため、静的メンバー関数またはフレンド関数にすることはできません。
2. インライン関数は、実行時にその位置を動的に決定できません。仮想関数がクラス内で定義されている場合でも、コンパイル時には非インラインとみなされます。
3. コンストラクターを仮想関数にすることはできません。また、デストラクターも仮想関数にすることができ、通常は仮想関数として宣言されます。