2016-05-12 19 views
5

次のコードはlate binding test()メソッドですが、早くバインドしないでください。テスト()メソッドは、クラスB(ただし、クラスA内)で仮想ではなく、関数がクラスのvirtual宣言されていたら、私たちはクラスB親クラスの親の仮想関数

class A{ 
    public: 
     virtual void test(){ 
      cout<<"test a"; 
     } 
}; 
class B : public A{ 
    public: 
     void test(){ 
      cout<<"Test b"; 
     } 
}; 
class C: public B{ 
    public: 
     void test(){ 
      cout<<"test c"; 
     } 
}; 
int main(){ 
    B *bp; 
    C objc; 
    bp = &objc; 
    bp->test(); // test c 
} 
+5

'test'はすべてのクラスで仮想です。 'virtual'キーワードを繰り返す必要はありません。 – MicroVirus

答えて

5

のポインタを使用しているので、それは常に仮想ですそのクラスを継承するクラスvirtualキーワードを使用するかどうかにかかわらず、です。

だからあなたのクラスCで、test()機能は、実際にBA自身test()の関数をオーバーライドしています。

4

N4296、10.3§2(draft version):

仮想メンバ関数VFは、ベース部材 関数VFから直接または間接的に派生し、クラスベースおよび派生 クラス内で宣言された場合Base :: vf と同じ名前、パラメータタイプリスト(8.3.5)、 cv-qualification、およびref-qualifier(または同じものがない)が宣言されている場合、派生:: vfも仮想それがそうであるかどうかにかかわらず、 が宣言されています)とそれはBase :: vfをオーバーライドします。

私は強調しています。

仮想関数は、派生クラスでvirtualと宣言されているかどうかにかかわらず、すべての派生クラスで仮想のままです。

関連する問題