Я слышал много раз, когда виртуальная функция обычно реализуется с помощью 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);
}
http://en.wikipedia.org/wiki/Vtable – Potatoswatter