Подтвердить что ты не робот

Изменения Vtable во время выполнения

Для тех реализаций компилятора, которые используют vtables: существуют ли случаи, когда таблицы виртуальных функций изменяются во время выполнения? Или vtables заполняются только во время компиляции, и никаких действий не выполняется для их изменения во время выполнения?

4b9b3361

Ответ 1

Я не знаю ни одного С++ ABI с реализацией полиморфизма, в которой во время выполнения используются виртуальные таблицы.

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

И поскольку это было бы не полезно, это было бы расточительно.

Ответ 2

Короткий ответ - нет.

Несколько более длинный (и, вероятно, специфический для реализации) ответ заключается в том, что указатель объекта на фактический vtable изменяется во время выполнения конструктора и деструктора производного полиморфного класса, так что переопределенные методы в производном классе не выполняются конструктор/деструктор базового класса, в то время как производный класс еще не построен/был разрушен.

Если вы хотите, чтобы объекты меняли класс во время выполнения, у вас есть несколько вариантов:

  • objective-c (++)

  • ручной код вашего собственного механизма отправки

  • python/javascript и т.д.

  • (лучший вариант) пересмотреть свой дизайн.