Грамматика C ++ имеет некоторые странности.Одна из них заключается в том, что объявление функции охватывает только часть объявления функции, начиная с имени функции (технически оно также включает в себя любые операторы указателя из типа, возвращаемого функцией, предшествующегоимя функции) и заканчивается в конце объявления функции (или в начале тела функции).
Тип возврата функции (опять-таки, за исключением операторов указателя ) и другихСпецификаторы, которые идут в начале объявления (включая virtual
), являются частью одноуровневого узла, называемого decl-спецификатор .
Итак, если ваша отправная точка - Декларатор функции , вам нужно перейти к decl-спецификатору через его родителя.Родителем может быть либо простое объявление (в случае объявления функции без тела), либо определение функции (объявление с телом), и вы должны проверять каждый случай.
Если у вас есть decl-спецификатор , вы можете проверить виртуальный, используя ICPPASTDeclSpecifier.isVirtual()
.
В коде:
// declarator is your ICPPASTFunctionDeclarator
ICPPASTDeclSpecifier declSpec = null;
if (declarator.getParent() instanceof IASTSimpleDeclaration) {
declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) declarator.getParent()).getDeclSpecifier();
} else if (declarator.getParent() instanceof IASTFunctionDefinition) {
declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition) declarator.getParent()).getDeclSpecifier();
}
if (declSpec != null) {
boolean isVirtual = declSpec.isVirtual();
}
Наконец, обратите внимание, что вышеизложенное говорит вам о том, появляется ли ключевое слово virtual
в объявлении функции.
Функция может быть виртуальной без ключевого слова virtual
, появляющегося в ее объявлении, если это функция впроизводный класс, переопределяющий виртуальную функцию в базовом классе.
Если вы действительно хотите знать, является ли функция виртуальной, даже если ключевое слово virtual
не используется, это более сложная задача.Я не думаю, что есть простой способ сделать это с помощью общедоступных API-интерфейсов CDT, но легче, если вы захотите использовать внутренние API-интерфейсы.Дайте мне знать, если вы заинтересованы в этом, я могу предоставить более подробную информацию.