Вызвать порядок функций в таблице виртуальных методов?

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

  2. Когда наследование класса с виртуальной таблицей, является виртуальной таблицей наследованного класса расширение базового класса или является совершенно новой виртуальной таблицей, составленной только с наследованными виртуальными функциями классов. (т.е. виртуальная таблица все еще в индексе +0x0 класса?)

5
задан Brian Tompsett - 汤莱恩 9 February 2017 в 20:28
поделиться

4 ответа

  1. (a) Насколько известно из стандарта, нельзя (на самом деле нельзя даже предполагать, что vtables существуют). (b) Возможно, но каковы обстоятельства, при которых вам нужно контролировать порядок, но вы не можете проверить это сами? Способ проверки - посмотреть на разборку виртуального вызова (и найти смещение(я), добавленное к указателю vtable для получения адреса вызова) или посмотреть на разборку самой vtable.

  2. Зависит от ситуации. При одиночном наследовании, вероятно, это расширение базового класса, и индекс 0 каждого объекта указывает на виртуальную таблицу класса, с указателем на правильную реализацию (возможно, переопределение) каждой виртуальной функции, объявленной в базовых классах, за которой следуют указатели на каждую виртуальную функцию, объявленную в производном классе. При множественном и виртуальном наследовании все не так просто (не может быть). Каждый объект будет содержать несколько указателей, либо на виртуальные таблицы, либо на структуры, содержащие виртуальные таблицы плюс другую информацию о классе, и при перемещении по иерархии классов значение указателя на объект меняется. Попробуйте и посмотрите.

Все это для очень гипотетической, "типичной реализации". У авторов компиляторов есть свои хитрости.

7
ответ дан 18 December 2019 в 09:05
поделиться

Это полностью определено реализацией. Стандарт C++ вообще не определяет какую-либо таблицу виртуальных функций - именно так он обычно реализуется.

7
ответ дан 18 December 2019 в 09:05
поделиться

Виртуальная таблица зависит от реализации. Она может быть расположена в любом порядке. Даже для реализации полиморфизма виртуальная таблица может вообще отсутствовать. Я рекомендую эту статью в Википедии, которая дает некоторые ответы на ваши вопросы.

2
ответ дан 18 December 2019 в 09:05
поделиться

Вопрос, который вы задали, заключается в том, по какой причине вам может понадобиться располагать vtable в определенном порядке?

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

0
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: