我遇到了他们解释 vptr 和 vtable 的文章。我知道在存储了虚函数的类的情况下,对象中的第一个指针是指向 vtable 的 vptr,而 vtable 的数组条目是指向函数的指针,其顺序与它们在类中出现的顺序相同(我已经用我的测试进行了验证程序)。但我试图了解编译器必须使用什么语法才能调用适当的函数。
例子:
class Base
{
virtual void func1()
{
cout << "Called me" << endl;
}
};
int main()
{
Base obj;
Base *ptr;
ptr=&obj;
// void* is not needed. func1 can be accessed directly with obj or ptr using vptr/vtable
void* ptrVoid=ptr;
// I can call the first virtual function in the following way:
void (*firstfunc)()=(void (*)(void))(*(int*)*(int*)ptrVoid);
firstfunc();
}
问题:
1.但我真正想了解的是编译器如何将调用替换ptr->func1()
为vptr
?如果我要模拟通话,我该怎么办?我应该重载->
运算符吗?但即使这样也无济于事,因为我不知道这个名字到底是什么func1
。即使他们说编译器通过vptr访问vtable,它仍然如何知道的条目func1
是第一个数组并且条目func2
是数组中的第二个元素?函数名称到数组元素必须有一些映射。
2.如何模拟。您能否提供编译器用于调用函数的实际语法func1
(它如何替换ptr->func1()
)?