CPPDepend Определение использования виртуальной функции
У меня небольшая проблема со способностью CPPDepend обнаруживать использование виртуальных функций. Рассмотрим следующий сценарий. Два класса, CParentClass и CChildClass, где CChildClass является производным от CParentClass. CParentClass имеет виртуальную функцию Test, а CChildClass переопределяет версию Test базового класса.
Когда дело доходит до использования, по разным причинам я хочу сделать что-то вроде следующего:-
CChildClass * pMyChild = new CChildClass();
CParentClass * pParentClass = (CParentClass*)pMyChild;
int B = pParentClass->Test();
delete pParentClass;
Это приводит к тому, что функция Test в pMyChild вызывается по желанию, но CPPDepend не обнаруживает это и утверждает, что код никогда не достигается. Если я добавлю слово "виртуальный" в заголовок функции Test в CChildClass (в дополнение к тому, что уже есть в CParentClass), то CPPDepend утверждает, что все в порядке.
Может ли кто-нибудь пролить некоторый свет на это для меня, пожалуйста, так как это неправильно, что я должен был поставить виртуальный в функции производного класса, а также функцию базового класса.
Подобная проблема может быть замечена с деструкторами CDialog в производных классах. Без виртуального в объявлении деструктора производного класса, CPPDepend жалуется.
Спасибо за любую помощь, которую вы можете оказать.
С уважением
Нил.
1 ответ
CppDepend выполняет статический анализ, а не динамический, и дает зависимости со статической точки зрения, и это более интересно. Действительно, важна зависимость, связанная с вариантами проектирования, например, в вашем случае объект объявлен как CParentClass, поэтому метод связан с контрактом CParentClass, а во время выполнения он может вызывать метод из дочерних классов.