Принудительно установить порядок функций в таблице виртуальных методов? - PullRequest
4 голосов
/ 12 июля 2010
  1. Как я могу контролировать порядок виртуальных функций в виртуальной таблице? Выложены ли они в том же порядке, в котором они объявлены?

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

Ответы [ 5 ]

7 голосов
/ 12 июля 2010
  1. (a) Что касается стандарта, вы не можете (фактически вы даже не можете предположить, что существуют vtables).(б) Возможно, но каковы обстоятельства, при которых вам нужно контролировать заказ, но вы не можете проверить сами?Способ проверки состоит в том, чтобы посмотреть на разборку виртуального вызова (и найти смещение (я), добавленное к указателю vtable для получения адреса вызова), или посмотреть на разборку самого vtable.

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

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

7 голосов
/ 12 июля 2010

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

2 голосов
/ 12 июля 2010

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

1 голос
/ 02 декабря 2010

Хотя, конечно, на 100% верно, другие ответы игнорируют очевидную правду.

Это не глупый вопрос, в зависимости от целей постеров.Слишком часто мы вынуждены использовать технологии для конкретных платформ для достижения нашей цели.В частности, то, что пытается сделать плакат, поразительно похоже на COM в Windows ... написание чистых виртуальных абстрактных интерфейсов, которые могут быть получены, является одним из немногих способов получить пуленепробиваемые библиотеки DLL C ++ без возврата к интерфейсу C.

Я столкнулся с той же проблемой при написании архитектуры плагинов на нативном C ++ - отсутствие ABI означает, что взаимодействовать невероятно сложно.

0 голосов
/ 12 июля 2010

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

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

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