В первую очередь, typeof является оператором, не функцией, таким образом, Вам не нужны круглые скобки. Во-вторых, получите доступ к прототипу объекта.
alert( typeof Array.prototype.push );
alert( typeof Array.prototype.foo );
, Когда Вы выполняетесь typeof Array.push
, Вы тестируете, если сам объект Массива имеет метод нажатия, не, если экземпляры Массива имеют метод нажатия.
Это сложный вопрос, но, очевидно, идея заключается в том, что эта функция сокрытия помогает избежать незаметных ошибок при внесении изменений в базовый класс (которые в противном случае могли бы «украсть» вызовы, которые раньше обрабатывались бы производным классом). Тем не менее, изменение базового класса может повлиять на результат компиляции производных классов, поэтому я не думаю, что понимаю это объяснение на 100%.
Я согласен, что эта тема обсуждается так часто, что, вероятно, сокрытие на самом деле увеличивает количество «сюрпризов» у программистов на C ++.
Подробное обсуждение этого вопроса можно найти здесь ...
Я уверен, что я видел этот случай, предложенный 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
.