2016-05-12 87 views
5

以下代碼是後期綁定test()方法,但不應該早綁定?因爲test()方法是不是在B類虛擬(但在A類),我們使用的是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

'測試'在這裏的所有課程中都是虛擬的; '虛擬'關鍵字不需要重複。 – MicroVirus

回答

5

的指針一旦功能已被宣佈爲一個類virtual,它在總虛擬無論您使用virtual關鍵字還是不使用,該類繼承自該類,

在類C

所以,test()功能實際上是壓倒一切的BA自己test()功能。

4

N4296,10.3§2(draft version):

如果虛擬成員函數VF在類Base和在派生一個 類中聲明的,直接或間接地從基地成員 函數VF衍生同名,參數類型列表(8.3.5), cv-qualification和ref-qualifier(或缺少相同)聲明爲Base :: vf ,則Derived :: vf也是虛擬的(不管它是否聲明如此 )並且它重寫Base :: vf。

強調我。

虛擬函數在所有派生類中保持虛擬,無論在派生類中是否聲明爲virtual