Цикломатическая сложность предоставляет приблизительную метрику того, насколько сложно понять данную функцию или какой потенциал содержит ошибки. В реализациях, о которых я читал, обычно все базовые конструкции потока управления (если, case, while, for и т. Д.) Увеличивают сложность функции на 1. Мне кажется, учитывая, что цикломатическая сложность предназначена для определения «количество линейно независимых путей в исходном коде программы», которое вызывает виртуальная функция, должно также увеличить цикломатическую сложность функции из-за неоднозначности, реализация которой будет вызываться во время выполнения (вызов создает другую ветвь на пути исполнение).
Тем не менее, штрафование функции к тому же количеству, которое было бы, если бы оно содержало эквивалентный оператор switch (одна точка для каждого ключевого слова case, с одним ключевым словом case для каждого класса в иерархии, реализующей рассматриваемую виртуальную функцию), кажется чрезмерным сурово, потому что вызов виртуальной функции обычно считается гораздо лучшей практикой программирования.
Какова должна быть стоимость цикломатической сложности вызова виртуальной функции? Я не уверен, является ли мое рассуждение аргументом против полезности цикломатической сложности как метрики или против использования виртуальных функций или как-то иначе.
Редактировать: После ответов людей я понял, что это не должно увеличивать цикломатическую сложность, потому что мы можем считать вызов виртуальной функции эквивалентным вызову глобальной функции, которая содержит массивный оператор switch. Несмотря на то, что эта функция получит плохой результат, она существует в программе только один раз, тогда как замена каждого вызова виртуальной функции непосредственно на оператор switch приведет к многократным затратам.