Как я могу управлять порядком виртуальных функций в виртуальной таблице? Они размечаются в том же порядке, в котором они объявляются?
Когда наследование класса с виртуальной таблицей, является виртуальной таблицей наследованного класса расширение базового класса или является совершенно новой виртуальной таблицей, составленной только с наследованными виртуальными функциями классов. (т.е. виртуальная таблица все еще в индексе +0x0 класса?)
(a) Насколько известно из стандарта, нельзя (на самом деле нельзя даже предполагать, что vtables существуют). (b) Возможно, но каковы обстоятельства, при которых вам нужно контролировать порядок, но вы не можете проверить это сами? Способ проверки - посмотреть на разборку виртуального вызова (и найти смещение(я), добавленное к указателю vtable для получения адреса вызова) или посмотреть на разборку самой vtable.
Зависит от ситуации. При одиночном наследовании, вероятно, это расширение базового класса, и индекс 0 каждого объекта указывает на виртуальную таблицу класса, с указателем на правильную реализацию (возможно, переопределение) каждой виртуальной функции, объявленной в базовых классах, за которой следуют указатели на каждую виртуальную функцию, объявленную в производном классе. При множественном и виртуальном наследовании все не так просто (не может быть). Каждый объект будет содержать несколько указателей, либо на виртуальные таблицы, либо на структуры, содержащие виртуальные таблицы плюс другую информацию о классе, и при перемещении по иерархии классов значение указателя на объект меняется. Попробуйте и посмотрите.
Все это для очень гипотетической, "типичной реализации". У авторов компиляторов есть свои хитрости.
Это полностью определено реализацией. Стандарт C++ вообще не определяет какую-либо таблицу виртуальных функций - именно так он обычно реализуется.
Виртуальная таблица зависит от реализации. Она может быть расположена в любом порядке. Даже для реализации полиморфизма виртуальная таблица может вообще отсутствовать. Я рекомендую эту статью в Википедии, которая дает некоторые ответы на ваши вопросы.
Вопрос, который вы задали, заключается в том, по какой причине вам может понадобиться располагать vtable в определенном порядке?
Одна из причин, по которой это зависит от реализации, заключается в том, что компилятор может сделать выбор, как расположить vtable по причинам производительности или другим требованиям, специфичным для данной архитектуры процессора.