Анализатор обнаружил в коде класса-наследника поле, совпадающее по типу и по имени с некоторым полем родительского класса. Такое объявление может быть ошибочным. Технология наследования сама по себе предполагает наличие всех полей родительского класса в дочернем. При объявлении в наследнике поля с таким же именем вносится путаница и усложняется жизнь программистам, которые будут сопровождать код.
В качестве примера можно привести следующий некорректный код:
class U {
public:
int x;
};
class V : public U {
public:
int x; // <=
int z;
};
Данный код может быть опасен, поскольку теперь в классе V существует две переменных x: собственно V::x и U::x. Последствия, к которым это может привести, могут быть проиллюстрированы следующим кодом:
int main() {
V vClass;
vClass.x = 1;
U *uClassPtr = &vClass;
std::cout << uClassPtr->x << std::endl; // <=
....
}
Здесь будет произведена печать неинициализированной переменной.
Для исправления проблемы достаточно удалить объявление переменной в классе-наследнике. Корректный код приведён ниже:
class U {
public:
int x;
};
class V : public U {
public:
int z;
};
Существует некоторое количество спорных случаев, которые анализатором не считаются ошибочными:
static;private;#define;Рекомендуем всегда проводить рефакторинг кода, где анализатор выдаёт предупреждение V703. Использование переменной с одним именем в базовом классе и в наследнике далеко не всегда является ошибкой. Однако такой код очень опасен, и даже если сейчас программа корректно работает, в дальнейшем при модификации классов очень легко допустить ошибку.
Данная диагностика классифицируется как:
|
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V703. |
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:
Испытай
удачу!