Объекты с одинаковыми именами в базовом и производном классах не помечаются как ошибки - PullRequest
7 голосов
/ 05 мая 2010
class Base
{
public:
 type1 m_Pants;
};

class Derived : Base
{
public:
 type2 m_Pants
};

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

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

Ответы [ 3 ]

7 голосов
/ 05 мая 2010

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

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

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

Ну, это не ошибка кода; это почти наверняка ошибка проектирования.

1 голос
/ 05 мая 2010

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

int func(int x)
{
    return x;
}

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

1 голос
/ 05 мая 2010

Он делает именно то, что должен делать. Производные тени базы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...