2010-09-11 2 views
2

Я слышал много раз, когда виртуальная функция обычно реализуется с помощью vtable. Но я фактически не знаю, как это реализовано и как оно работает.виртуальное ключевое слово внутри

редактировать

Я на самом деле не получить этот код: Как это может быть переписано. Может кто-нибудь объяснить это подробно, пожалуйста.

Наконец, давайте посмотрим, как компилятор реализует вызов виртуальной функции. Ваш код может выглядеть следующим образом:

// Your original C++ code 

void mycode(Base* p) 
{ 
    p->virt3(); 
} 

компилятор не знает это собирается ли называть Base::virt3() или Der::virt3() или, возможно, virt3() метод другого производного класса, который вовсе даже не существует. Он точно знает, что вы вызываете virt3(), который является функцией в слоте № 3 v-таблицы. Он переписывает этот призыв в нечто вроде этого:

// Pseudo-code that the compiler generates from your C++ 

void mycode(Base* p) 
{ 
    p->__vptr[3](p); 
} 
+0

http://en.wikipedia.org/wiki/Vtable – Potatoswatter

ответ

0

Общая реализация состоит в том, чтобы иметь один указатель в начале каждого экземпляра объекта, который указывает на таблицу vtable. Существует один vtable для каждого класса, поэтому, если у вас есть класс A и класс B, для каждой таблицы будет одна таблица.

В виртуальной таблице есть куча указателей на функции, поэтому, если класс A имеет две виртуальные функции, foo() и bar(), таблица будет иметь указатели на обе. Если класс B переопределяет эти две функции, он будет иметь свои версии foo() и bar() при одинаковых смещениях.

4

Объяснение internals of virtual functions на часто задаваемые вопросы C++ очень хорошо. Вы должны дать ему прочитать. Я думаю, было бы лучше, если бы вы попытались понять это сами, а затем задали свои сомнения.

0

Простой способ понять, как работает vtables - реализовать тот же тип функциональности в C, используя указатели на функции, потому что все, что есть vtable, является таблицей указателей на конкретные реализации.

Смежные вопросы