父类父类中的虚函数

时间:2016-05-12 09:30:27

标签: c++ virtual-functions late-binding

以下代码是后期绑定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
}

2 个答案:

答案 0 :(得分:5)

一个函数在类中声明为virtual后,它在从该类继承的类中始终是虚拟的,是否使用virtual关键字< /强>

因此,在您的班级C中,test()函数实际上覆盖了BA自己的test()函数。

答案 1 :(得分:4)

N4296,10.3§2(draft version):

  

如果在类Base和a中声明了虚拟成员函数vf   class派生,直接或间接来自Base,一个成员   函数vf,同名,参数类型列表(8.3.5),   与Base :: vf一样的cv-qualification和ref-qualifier(或不存在)   声明,然后Derived :: vf也是虚拟(无论是否如此   声明)并覆盖Base :: vf。

我的重点。

虚拟函数在所有派生类中保持虚拟,无论它是否在派生类中声明为virtual