Boost.TypeTraits предлагает черту is_polymorphic , но вам, возможно, придется сделать некоторую хитрость, чтобы применить ее везде, где это необходимо. (Например, вызов is_polymorphic
для базового класса не скажет вам, если производный класс ввел виртуальную функцию.)
В зависимости от вашей системы сборки и доступных инструментов, вы можете ввести там проверки. Например, если я запускаю nm -C
в объектном файле, созданном GCC, я вижу следующий вывод для простого тестового класса с виртуальными функциями:
0000000e T TestMe::TestMe()
00000078 T TestMe::~TestMe()
00000000 V typeinfo for TestMe
00000000 V typeinfo name for TestMe
00000000 V vtable for TestMe
Таким образом, я могу настроить свой make-файл (или любой другой) для запуска nm -C
на всех объектных файлах и выдавать ошибку, если они содержат vtable for
.