LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

В dog - объекте - есть ссылка на таблицу с виртуальными функциями, которые относятся к его классу. Грубо можно сказать, что эта ссылки и есть идентификатор класса данного объекта (это очень условно).

Ты вызываешь dog->speak, в коде берется объект, берётся из него указатель на таблицу с указателями на методы _vptr (виртуальные функции), и вызывает метод, на который указывал элемент N таблицы. То есть dog->speak превращается в (*(dog->_vptr))[0](self, args) - при условии что у тебя speak - единственная виртуальна функция, так что индекс 0 соответствует именно speak.

Если у тебя в классе есть хоть один виртуальный метод, то компилятор добавляет в класс еще одну переменную - указатель на таблицу виртуальных методов _vptr. То есть даже если у тебя в классе ноль переменных, но есть хотябы одна виртуальная функция, то на самом деле у тебя в класе одна переменная _vptr; ее добавит компилятор.

The compiler also adds _vptr at the beginning of any such classes having virtual methods.

Исходная версия Kroz, :

В dog - объекте - есть ссылка на таблицу с виртуальными функциями, которые относятся к его классу. Грубо можно сказать, что эта ссылки и есть идентификатор класса данного объекта (это очень условно).

Ты вызываешь dog->speak, в коде берется объект, берётся из него указатель на таблицу с указателями на методы _vptr (виртуальные функции), и вызывает метод, на который указывал элемент N таблицы. То есть dog->speak превращается в *(dog->_vptr)[0](self, args) - при условии что у тебя speak - единственная виртуальна функция, так что индекс 0 соответствует именно speak.

Если у тебя в классе есть хоть один виртуальный метод, то компилятор добавляет в класс еще одну переменную - указатель на таблицу виртуальных методов _vptr. То есть даже если у тебя в классе ноль переменных, но есть хотябы одна виртуальная функция, то на самом деле у тебя в класе одна переменная _vptr; ее добавит компилятор.

The compiler also adds _vptr at the beginning of any such classes having virtual methods.