2016-05-12 118 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