如果你有一个类的对象有虚函数,并且这个对象不是指针,会使用虚方法表吗?
例如,让我们假设类
Student
有一个虚函数 GetGrade()
。既然my_student
不是指向多态类的指针,那么会使用虚方法表吗?
Student my_student{};
my_student.GetGrade();
当我尝试此操作时,我希望查询 vtable,但它没有发生。
这是一个简单的“去虚拟化”案例,或者“在不读取虚函数表的情况下调用正确的函数”。这是一种优化:代码执行相同的操作但速度更快。编译器可以对您的代码执行任何优化,许多编译器都会这样做。 在这种特定情况下,(对于编译器)很容易证明
my_student
的运行时类型是
Student
:运行时类型与静态类型相同,因为它是对象而不是指针。即使它是一个指针,在以下情况下它仍然可以进行这种优化:Student* my_student{new Student};
my_student->GetGrade();
在这里,
*my_student
不可能有除
Student
之外的任何其他类型。但是,如果代码中对象的创建和使用不在附近,则无法执行优化。Student* my_student{};
if (special)
my_student = new SpecialStudent;
else
my_student = new Student;
my_student->GetGrade();