非指针对象的虚方法表?

问题描述 投票:0回答:1

如果你有一个类的对象有虚函数,并且这个对象不是指针,会使用虚方法表吗?

例如,让我们假设类

Student
有一个虚函数
GetGrade()
。既然
my_student
不是指向多态类的指针,那么会使用虚方法表吗?

Student my_student{};

my_student.GetGrade();

当我尝试此操作时,我希望查询 vtable,但它没有发生。

c++ virtual-functions vtable
1个回答
0
投票

这是一个简单的“去虚拟化”案例,或者“在不读取虚函数表的情况下调用正确的函数”。这是一种优化:代码执行相同的操作但速度更快。编译器可以对您的代码执行任何优化,许多编译器都会这样做。 在这种特定情况下,(对于编译器)很容易证明

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();

© www.soinside.com 2019 - 2024. All rights reserved.