Для тех реализаций компилятора, которые используют vtables: существуют ли случаи, когда таблицы виртуальных функций изменяются во время выполнения? Или vtables заполняются только во время компиляции, и никаких действий не выполняется для их изменения во время выполнения?
Изменения Vtable во время выполнения
Ответ 1
Я не знаю ни одного С++ ABI с реализацией полиморфизма, в которой во время выполнения используются виртуальные таблицы.
Во всяком случае, это было бы не очень полезно, так как виртуальные таблицы обычно описывают свойство кода (отношение функций-членов друг к другу по позиции в иерархии классов), а код С++ не изменяется во время выполнения.И поскольку это было бы не полезно, это было бы расточительно.
Ответ 2
Короткий ответ - нет.
Несколько более длинный (и, вероятно, специфический для реализации) ответ заключается в том, что указатель объекта на фактический vtable изменяется во время выполнения конструктора и деструктора производного полиморфного класса, так что переопределенные методы в производном классе не выполняются конструктор/деструктор базового класса, в то время как производный класс еще не построен/был разрушен.
Если вы хотите, чтобы объекты меняли класс во время выполнения, у вас есть несколько вариантов:
-
objective-c (++)
-
ручной код вашего собственного механизма отправки
-
python/javascript и т.д.
-
(лучший вариант) пересмотреть свой дизайн.