MISRA C++:2008 Rule 10-2-1

Все доступные имена сущности в иерархии наследования кратного должны быть уникальными

Описание

Управляйте определением

Все доступные имена сущности в иерархии наследования кратного должны быть уникальными.

Объяснение

Элементы данных и невиртуальные функции в той же иерархии наследования, которые имеют то же имя, могут вызвать беспорядок разработчика. Сущность разработчик, предназначенный для использования, не может быть сущностью компилятор, выбирает. Избегайте использования групповых имен для доступных сущностей в иерархии наследования кратного.

Реализация Polyspace

Это средство проверки отмечает сущности от отдельных классов, которые принадлежат тому же производному классу, если у них есть неоднозначное имя. Имя сущности неоднозначно если:

  • Две переменные совместно используют то же имя, даже если они имеют различные типы.

  • Две функции совместно используют то же имя, те же параметры, и то же самое возвращает тип.

Если элемент данных, к которому получают доступ в производном классе, неоднозначен, Polyspace® отчеты эта проблема как проблема компиляции, не нарушение правила кодирования. Средство проверки не проверяет на конфликты между сущностями различных видов, такими как функции членства против элементов данных.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

развернуть все

#include<iostream>
#include<cstdlib>
#include<cstdint>

using namespace std;

class A
{
public:
	int32_t num;                  //Noncompliant
	int32_t total;                //Compliant
	int32_t sum(int32_t toSum)    //Noncompliant
	{
		total = toSum + num;
	};		
};

class B
{
public:
	int32_t num;                  //Noncompliant
	int32_t total();              //Compliant
	int32_t sum(int32_t toSum)    //Noncompliant
	{
		num = toSum + num;
	};		
};


class C : public A, public B    
{
public:
	void foo()
	{
		num = total;
		sum(num);
	}
};
  • Поскольку class A и class B задайте их собственную локальную переменную int32_t num, и потому что class C является кратным иерархия наследования, содержащая class A и class B, Polyspace отмечает оба int32_t num переменные как несовместимые.

  • Поскольку int32_t sum() в class A и int32_t sum() в class B совместно используйте то же имя, возвратите тип, аргументы, и члены той же иерархии множественного наследования, обе функции отмечаются Polyspace как несовместимые.

  • Поскольку int32_t total и int_32t total() различные типы членов класса, Polyspace не отмечает их даже при том, что они - часть той же иерархии множественного наследования.

О неоднозначных элементах данных можно сообщить, когда компиляция выходит.

Проверяйте информацию

Группа: производные классы
Категория: необходимый
Введенный в R2013b