Рассмотрите приведенный ниже код.Как индексирование в виртуальной таблице определяется в C++?
#include<iostream>
using namespace std;
class Base
{
public:
virtual void function1() {cout<<"Base:function1()\n";};
virtual void function2() {cout<<"Base:function1()\n";};
};
class D1: public Base
{
public:
virtual void function1() {cout<<"D1:function1()\n";};
virtual void function2() {cout<<"D1:function2()\n";};
};
int main()
{
Base *ptr= new D1;
ptr->function1();
ptr->function2();
return 0;
}
ptr будет указывать на D1 obj. поэтому всякий раз, когда я вызываю ptr-> function1(), адрес функции выбирается из виртуальной таблицы класса D1. Он также работает для ptr-> function2().
В этом случае vtable [0] будет иметь указатель на функцию function1(), vtable [1] будет иметь указатель на функцию function2().
Вопрос: как происходит вызов функции для отображения индекса таблицы vtable?
Как ptr-> function1() & ptr-> function2() индексы к таблице vtable [0] & vtable [1] соответственно?
См. Http://stackoverflow.com/questions/70682/what-is-the-vtable-layout-and-vtable-pointer-location-in-c-objects-in-gcc-3-x – vcp
Компилятор в какой-то момент решает и принимает во внимание свои внутренние структуры данных, как и для всего остального. Обычно алгоритм должен зависеть только от определения класса, так что в каждом ТУ ему ничего не нужно, чтобы создать тот же виртуальный стол, что и в каждом другом ТУ. –
Это происходит во время компиляции. Компилятор знает, что эти функции являются виртуальными и как их называть. – molbdnilo