基类指针调用派生类虚函数为何执行基类非虚函数?
为什么基类指针调用派生类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
相关产品推荐
相关产品推荐

