Объекты того же имени в основе и производном классе, не отмечаемом как ошибка

class Base
{
public:
 type1 m_Pants;
};

class Derived : Base
{
public:
 type2 m_Pants
};

Это по существу не стало отмеченным как ошибка, но создавало все виды избиения и проблем в течение проекта.

Кто-либо знает о технической особенности, которая не отметила бы это?

8
задан Matthew Flaschen 5 May 2010 в 00:56
поделиться

3 ответа

Это не помечается как ошибка, потому что это не ошибка. Нет ничего, что говорило бы о том, что у вас не может быть членов в производном классе, названных так же, как члены в базовом классе.

Если у вас есть объект obj типа Derived , то obj.m_Pants относится к m_Pants в Derived . Если вы хотите обратиться к базовому члену, вы можете сделать это с помощью obj.Base :: m_Pants .

Если вы используете функцию-член Base или имеете Base * , которая указывает на объект типа Derived , то m_Pants всегда относится к члену Base , потому что в этих контекстах нет сведений о классе Derived и его членах.

Что ж, это не ошибка кода; это почти наверняка ошибка дизайна.

9
ответ дан 5 December 2019 в 15:21
поделиться

Он делает именно то, что должен делать. Полученные тени затеняют базу.

1
ответ дан 5 December 2019 в 15:21
поделиться

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

int func(int x)
{
    return x;
}

вернет значение x , которое вы передали, а не значение переменной-члена x . Один вариант бле «тени» другого. Вот почему рекомендуется называть переменные так, чтобы у них никогда не было имен, которые могли бы конфликтовать.

1
ответ дан 5 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: