拥有虚函数的非指针类对象调用虚函数时,会使用virtual method table吗?
非指针对象调用虚函数会使用虚函数表吗?
当你直接用非指针/引用的对象(比如栈上的Student my_student{};)调用虚函数时,不会触发虚函数表(vtable)的查询,编译器会直接做静态绑定。
原因很直接:编译器在编译阶段就能完全确定这个对象的具体类型——它就是Student本身,不存在任何多态的可能性。既不可能是Student的子类对象(对象的类型是编译期固定的,无法在运行时改变),也没有基类对象切片的情况(这里根本没用到基类)。所以编译器可以直接把my_student.GetGrade()的调用直接解析到Student::GetGrade()的内存地址,不需要在运行时去查虚表找实际要调用的函数。
只有当通过指针或引用调用虚函数,且指针/引用的静态类型和动态类型不一致时,才会触发动态绑定(查虚表)。比如:
// 假设Student有子类Undergraduate,重写了GetGrade class Undergraduate : public Student { public: int GetGrade() override { return 90; } }; // 静态类型是Student*,动态类型是Undergraduate* Student* student_ptr = new Undergraduate(); student_ptr->GetGrade(); // 这里会查询虚表,调用Undergraduate的版本
内容的提问来源于stack exchange,提问作者BeginDev02
相关产品推荐
相关产品推荐

