class Base
{
public:
type1 m_Pants;
};
class Derived : Base
{
public:
type2 m_Pants
};
Это по существу не стало отмеченным как ошибка, но создавало все виды избиения и проблем в течение проекта.
Кто-либо знает о технической особенности, которая не отметила бы это?
Это не помечается как ошибка, потому что это не ошибка. Нет ничего, что говорило бы о том, что у вас не может быть членов в производном классе, названных так же, как члены в базовом классе.
Если у вас есть объект obj
типа Derived
, то obj.m_Pants
относится к m_Pants
в Derived
. Если вы хотите обратиться к базовому члену, вы можете сделать это с помощью obj.Base :: m_Pants
.
Если вы используете функцию-член Base
или имеете Base *
, которая указывает на объект типа Derived
, то m_Pants
всегда относится к члену Base
, потому что в этих контекстах нет сведений о классе Derived
и его членах.
Что ж, это не ошибка кода; это почти наверняка ошибка дизайна.
Он делает именно то, что должен делать. Полученные тени затеняют базу.
Одна переменная затеняет другую. Это похоже на то, как если бы вы объявили имя переменной-члена x
, а затем имели функцию-член, которая объявила свою собственную x
, за исключением того, что здесь , одна из переменных находится в базовом классе, а другая - в производном.
int func(int x)
{
return x;
}
вернет значение x
, которое вы передали, а не значение переменной-члена x
. Один вариант бле «тени» другого. Вот почему рекомендуется называть переменные так, чтобы у них никогда не было имен, которые могли бы конфликтовать.