C ++: обоснование правила сокрытия

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

alert( typeof Array.prototype.push );
alert( typeof Array.prototype.foo );

, Когда Вы выполняетесь typeof Array.push, Вы тестируете, если сам объект Массива имеет метод нажатия, не, если экземпляры Массива имеют метод нажатия.

25
задан peoro 30 January 2011 в 15:30
поделиться

2 ответа

Это сложный вопрос, но, очевидно, идея заключается в том, что эта функция сокрытия помогает избежать незаметных ошибок при внесении изменений в базовый класс (которые в противном случае могли бы «украсть» вызовы, которые раньше обрабатывались бы производным классом). Тем не менее, изменение базового класса может повлиять на результат компиляции производных классов, поэтому я не думаю, что понимаю это объяснение на 100%.

Я согласен, что эта тема обсуждается так часто, что, вероятно, сокрытие на самом деле увеличивает количество «сюрпризов» у программистов на C ++.

Подробное обсуждение этого вопроса можно найти здесь ...

10
ответ дан 28 November 2019 в 21:45
поделиться

Я уверен, что я видел этот случай, предложенный BigWig C ++, не уверен, что:

struct Base {
    void f(const Base&);
};

struct Derived : Base {
    using Base::f;
    void f(double);
};

int main() {
    Derived d;
    d.f('a'); // calls Derived::f
}

Теперь, добавьте void f(int); к Base, и значение основных изменений - он вызывает Base::f, потому что int лучше подходит для char - это целочисленное продвижение, а не стандартное преобразование.

Не ясно, действительно ли это изменение в базе было предназначено программистом для перехвата вызовов с char, поэтому требование using быть явным означает, что поведение по умолчанию означает, что изменение не не влияет на код вызова. Я считаю, что это маргинальный вызов, но я думаю, что комитет решил, что базовые классы в C ++ были достаточно хрупкими, без этого тоже: -)

Ключевое слово «hide» не нужно, потому что нет сопоставимого случай сокрытия "f" от базы, когда оно не перегружено в Derived.

Кстати, я выбрал типы, и char намеренно неуместно. Вы можете получить более тонкие случаи с int против unsigned int вместо int против char.

7
ответ дан 28 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

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