派生类中的方法在引用的类中没有* virtual *关键字时执行

时间:2017-02-07 06:35:15

标签: c++ override virtual-functions

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 类中的虚拟关键字正在影响总线类的方法,我在哪里错过了这一点?

1 个答案:

答案 0 :(得分:3)

virtual关键字是一个说明符,表示应通过动态调度调用该函数。它并不需要在每个派生类中重复;一旦成员函数是虚拟的,它在每个派生类中都是虚拟的。

通过动态调度调用的是来自覆盖它的派生程度最高的类的版本。因此,在您的情况下,b指向的对象的动态类型为supervehicle,因此调用的函数为supervehicle::drive,而不是bus::drive

2011版C ++标准版中出现的相关说明符为override。您应该在重写函数上使用它,让编译器知道您正在尝试覆盖虚函数。如果在函数原型中出错,编译器将发出诊断信息。