Разрешение вптр - PullRequest
       11

Разрешение вптр

2 голосов
/ 29 сентября 2011
class base {
public:
    virtual void fn(){}
};

class der : public base {};

Я знаю, что компилятор обеспечивает вызов члена VPTR в классе, который инициализируется точным VTABLE во время выполнения конструктором.У меня есть 2 вопроса

1) Какой класс содержит VPTR.или у всего класса есть отдельный VPTR.

2) При выполнении оператора der d; как разрешается VPTR во время выполнения?

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

Примечание: виртуальная таблица и виртуальный указатель являются деталями реализации, хотя все известные мне компиляторы C ++ используют их не в соответствии со стандартом, а только в результатах.

Чтобы ответить на ваш конкретный вопрос: для каждого экземпляра класса с виртуальными методами (либо его собственными, либо унаследованными), либо класса с (где-то) виртуальным наследованием требуется хотя бы один виртуальный указатель.

Их может быть несколько (если речь идет о виртуальном наследовании или множественном наследовании).

В вашем примере достаточно одного виртуального указателя.Однако не имеет смысла говорить об этом как о части class.Виртуальный указатель является частью экземпляра (объекта) и живет вне правил классов, поскольку они применяются к языку, а виртуальный указатель является механизмом реализации.

2 голосов
/ 29 сентября 2011

vtable создается для класса, который содержит виртуальную функцию, и для классов, производных от нее. Это значит, что в вашей программе vtable будет создано для base класса и der класса. Каждый из них vtables будет содержать адрес виртуальной функции void fn(). Обратите внимание, что класс der не содержит определения void fn(), поэтому его vtable содержит адрес void fn() функции base класса. Таким образом, если Вы делаете вызов, как d.fn();, будет выполняться void fn() функция класса base.

0 голосов
/ 29 сентября 2011

1) какой класс содержит VPTR. или у всех классов есть отдельный VPTR.

Каждый class объект имеет свой собственный vptr, если class является полиморфным (то есть содержит virtual функцию или имеет virtual наследование.) В этом случае оба класса имеют virtual функция.

2) при выполнении оператора der d; как разрешается VPTR во время выполнения?

Вы только что объявили объект der. Но даже если вы вызываете функцию, то в этом случае вызов любой функции разрешается в время компиляции . Разрешение виртуальной функции появляется только тогда, когда функция вызывается с указателем / ссылкой.

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