Таким образом, можно сделать системный вызов пользовательской функцией для чистых виртуальных функций [1]. Это ставит вопрос о том, что может сделать такая функция. Для GCCНаписание пользовательского чистого виртуального обработчика: каково состояние стека и регистрируется при его вызове
Vtable for Foo
Foo::_ZTV3Foo: 5u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI3Foo)
16 0u
24 0u
32 (int (*)(...))__cxa_pure_virtual
И он помещается непосредственно в слот для чистой виртуальной функции. Так как прототип функции void foo()
не соответствует подлинной сигнатуре, является ли стек еще нормальным? В частности, я могу выбросить исключение и поймать его где-нибудь и продолжить выполнение.
[1] Is there an equivilant of _set_purecall_handler() in Linux?
Ссылка на страницу спецификации ABI? – user877329
вызов конвенций и регистров. –
Кстати, в отношении вашего последнего предложения можно предоставить определение для чистой виртуальной функции, так что предложение может быть сделано для чистых виртуальных функций при сохранении абстрактного класса. – celticminstrel