You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基类指针调用派生类虚函数为何执行基类非虚函数?

为什么基类指针调用派生类virtual函数却执行基类版本?

你在学习C++虚函数时遇到了这个问题:基类Vehicle的steer()是非virtual函数,派生类Car将同名的steer()声明为virtual函数,用基类指针指向派生类对象并调用steer()时,实际执行的是基类的函数,而非预期的派生类函数。

代码示例

#include<iostream>

using namespace std;

class Vehicle{
        public:
        void steer(){
                cout<<"Steering Vehicle";
        }
};

class Car: public Vehicle{
        public:
        virtual void steer(){
                cout<<"Steering car";
        }
};
int main(){
        Vehicle* v1=new Car();
        v1->steer();
        return 0;
}

当前输出

Steering Vehicle

预期输出

Steering car

原因解释

C++的多态动态绑定机制必须以基类声明virtual函数为前提,你的代码恰好违反了这个核心规则:

  • 当基类的steer()不是virtual时,编译器会进行静态绑定——编译阶段就根据指针的类型(Vehicle*)确定调用基类的steer(),完全不会考虑指针指向的实际对象是Car类型。
  • 派生类Car里给steer()加virtual,仅能让该函数在Car及其子类中成为虚函数,但无法回溯修改基类函数的属性,因此基类指针调用时依然走静态绑定逻辑。

解决方法

只需将基类Vehicle中的steer()声明为virtual,此时整个继承链中的同名函数会自动具备虚函数属性(派生类可以省略virtual关键字,不影响效果):

#include<iostream>

using namespace std;

class Vehicle{
        public:
        virtual void steer(){
                cout<<"Steering Vehicle";
        }
};

class Car: public Vehicle{
        public:
        void steer(){
                cout<<"Steering car";
        }
};
int main(){
        Vehicle* v1=new Car();
        v1->steer(); // 此时会调用Car的steer()
        return 0;
}

内容的提问来源于stack exchange,提问作者Elanchezian R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 00:08:27