Когда создается VTable в C ++? - PullRequest
       22

Когда создается VTable в C ++?

10 голосов
/ 03 октября 2010

Я хотел бы знать, когда создается vtable? Находится ли он в коде запуска перед main () или в другой момент времени?

Ответы [ 2 ]

12 голосов
/ 03 октября 2010

A vtable не является концепцией C ++, поэтому, если они используются и когда они создаются, если они используются, будет зависеть от реализации.1006 * - это структуры, созданные во время компиляции (потому что они могут быть определены во время компиляции).Когда объекты определенного типа создаются во время выполнения, они будут иметь vptr , который будет инициализирован для указания на статическую vtable во время построения.

3 голосов
/ 03 октября 2010

vtable создается во время компиляции.Когда новый объект создается во время выполнения, скрытый указатель виртуальной таблицы устанавливается так, чтобы он указывал на виртуальную таблицу.

Имейте в виду, однако, что вы не сможете надежно использовать виртуальные функции, пока объект не будетполностью построен.(Нет вызова виртуальных функций в конструкторе.)

РЕДАКТИРОВАТЬ Я думал, что я отвечу на вопросы в комментариях.

Как было указано, точные деталио том, как создается и используется vtable, остается до реализации.Спецификация c ++ предоставляет только определенные поведения, которые должны быть гарантированы, так что есть много возможностей для реализации.Он не должен использовать vtables вообще (хотя большинство из них).Как правило, вам не нужно знать эти детали.Вам просто нужно знать, что когда вы вызываете виртуальную функцию, она делает то, что вы ожидаете, независимо от того, как это делает.

Тем не менее, я проясню пару моментов о типичнойреализация.Класс с виртуальными функциями имеет скрытый указатель (мы будем называть vptr), который указывает на vtable для этого класса.Предположим, у нас есть класс сотрудника:

class Employee {
public:
  virtual work();
};

Этот класс будет иметь vptr в своей структуре, поэтому на самом деле он может выглядеть так:

class Employee {
public:
  vtble *vptr;  // hidden pointer
  virtual work();
};

Когда мы наследуем этот класс,он также будет иметь vptr, и он должен быть в том же месте (в этом случае, в начале).Таким образом, когда вызывается функция, независимо от типа производного класса, она всегда использует vptr в начале для поиска нужной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...