class vehicle
{
public:
virtual void drive()
{
cout<<"in vehicle drive"<<endl;
}
};
class bus:public vehicle
{
public:
void drive()
{
cout<<"in bus drive"<<endl;
}
};
class supervehicle:public bus
{
public:
void drive()
{
cout<<"in supervehicle"<<endl;
}
};
int main()
{
bus *b;
b=new supervehicle();
b->drive();
return 0;
}
我期望输出为“在总线驱动器中”,但输出是“in supervehicle”。 如果 virtual 关键字与总线类中的驱动器方法相关联,那么输出应该是在总线驱动器中。我知道我们继承了车辆类,但我们仍然只为总线类创建了指针。有人可以帮助我,为什么 vehicle 类中的虚拟关键字正在影响总线类的方法,我在哪里错过了这一点?
答案 0 :(得分:3)
virtual
关键字是一个说明符,表示应通过动态调度调用该函数。它并不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的。
通过动态调度调用的是来自覆盖它的派生程度最高的类的版本。因此,在您的情况下,b
指向的对象的动态类型为supervehicle
,因此调用的函数为supervehicle::drive
,而不是bus::drive
。
2011版C ++标准版中出现的相关说明符为override
。您应该在重写函数上使用它,让编译器知道您正在尝试覆盖虚函数。如果在函数原型中出错,编译器将发出诊断信息。