﻿# V301\. Unexpected function overloading behavior\. See N argument of function 'foo' in derived class 'derived' and base class 'base'\.


> Это правило входит в группу "Диагностика 64\\\-битных ошибок"\\\. Разработка правил этой группы больше не ведётся, и в будущем они могут быть отключены\\\. Если вы используете эти правила, \[свяжитесь с нашей поддержкой\]\(https://pvs\-studio\.ru/ru/about\-feedback/\) — мы поможем найти замену или предложим альтернативное решение\\\.

Анализатор обнаружил потенциально возможную ошибку, связанную с изменением поведения перекрытых виртуальных функций\. 

Пример изменения поведения виртуальных функций\.

```cpp
class CWinApp {
  ...
  virtual void WinHelp(DWORD_PTR dwData, UINT nCmd);
  ...
};
class CSampleApp : public CWinApp {
  ...
  virtual void WinHelp(DWORD dwData, UINT nCmd);
  ...
};
```

Перед вами классический пример, с которым может столкнуться разработчик, переносящий свое приложение на 64\-битную архитектуру\. Проследим жизненный цикл разработки некоторого приложения\. Пусть первоначально оно разрабатывалось под Visual Studio 6\.0\. когда, функция 'WinHelp' в классе 'CWinApp' имела следующий прототип:

```cpp
virtual void WinHelp(DWORD dwData, UINT nCmd = HELP_CONTEXT);
```

Совершенно корректно было осуществить перекрытие виртуальной фукции в классе 'CSampleApp', как показано в примере\. Затем проект был перенесен в Visual Studio 2005, где прототип функции в классе 'CWinApp' претерпел изменения, заключающиеся в смене типа 'DWORD' на тип 'DWORD\_PTR'\. На 32\-битной платформе такая программа продолжит совершенно корректно работать, так как здесь типы 'DWORD' и 'DWORD\_PTR' совпадают\. Неприятности проявят себя при компиляции данного кода под 64\-битную платформу\. Получатся две функции с одинаковыми именами, но с различными параметрами, в результате чего перестанет вызываться пользовательский код\.

Анализатор позволяет обнаруживать подобные ошибки, исправление которых не представляет сложности\. Достаточно изменить прототип функции в классе наследника, как показано ниже:

```cpp
class CSampleApp : public CWinApp {
  ...
  virtual void WinHelp(DWORD_PTR dwData, UINT nCmd);
  ...
};
```

Дополнительные материалы по данной теме:

1. 64\-битные уроки\. Урок 12\. Паттерн 4\. [Виртуальные функции](https://pvs-studio.ru/ru/blog/lessons/0012/)\.