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

method in the derived class got executed without a *virtual* keyword in the referred class

本文关键字:virtual 关键字 执行 情况下 引用 方法 派生      更新时间:2023-10-16
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;
}

我预计输出为"在总线驱动中">,但输出是"在超级跑车中"。如果 virtual 关键字与总线类中的驱动器方法相关联,则输出肯定应该在总线驱动器中我知道我们已经继承了车辆类,但我们仍然只为总线类创建了指针。有人可以帮我为什么车辆类中的虚拟关键字会影响公交车类的方法,我在哪里错过了重点?

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

通过动态调度调用的版本是覆盖它的派生类中的版本。所以在你的例子中,b指向的对象的动态类型是supervehicle,所以调用的函数是supervehicle::drive,而不是bus::drive

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