以下代码是后期绑定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
}
答案 0 :(得分:5)
一个函数在类中声明为virtual
后,它在从该类继承的类中始终是虚拟的,是否使用virtual
关键字< /强>
因此,在您的班级C
中,test()
函数实际上覆盖了B
和A
自己的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
。