C++中无需Virtual function能否实现Runtime Polymorphism(方法重写)?
无虚函数与指针的函数重写场景属于运行时多态吗?
首先明确结论:你示例中的代码不属于运行时多态,核心原因是这里的函数行为是编译时静态绑定的,而非运行时动态绑定。
关键概念区分
- 函数隐藏(Function Hiding):你代码里
dog类的print函数只是隐藏了基类animal的同名函数,而非重写(Overriding)。重写的前提是基类函数被声明为virtual,派生类函数匹配签名才能构成重写。 - 运行时多态的核心:必须依赖动态绑定——程序运行时才根据对象的实际类型决定调用哪个函数,而非编译时根据变量的声明类型确定。
对你示例代码的分析
obj1是dog类型的对象,编译器在编译阶段就明确知道它的实际类型是dog,所以直接绑定dog::print,这是编译时确定的行为。obj2是cat类型的对象,因为cat没有定义同名的print函数,编译器直接绑定基类animal::print,同样是编译时确定的。
只有当你使用基类指针或引用指向派生类对象,且基类函数是虚函数时,才会触发运行时多态:
#include <iostream> using namespace std; class animal{ public: virtual void print(){ // 声明为虚函数 cout<<"I am animal"<<endl; } }; class dog: public animal{ public: void print() override{ // 重写虚函数 cout<<"I am dog"<<endl; } }; int main() { animal* ptr = new dog(); ptr->print(); // 运行时根据对象实际类型(dog)调用对应函数,这才是运行时多态 delete ptr; return 0; }
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

