Я узнал, что внутренние имена скрывают внешние имена (поэтому перегрузка не выходит за рамки), потому что поиск имени предшествует сопоставлению типов. Поэтому я пишу следующий код C++, чтобы поиграть с этим правилом:
class Base {
public:
virtual void fcn() {}
};
class Derived : public Base {
public:
void fcn(std::string s) {}
};
Base* bp = new Derived;
bp->fcn();
delete bp;
Согласно правилу скрытия, функция Derived::fcn(std::string)
должна скрывать Base::fcn()
. Но приведенный выше код компилируется и работает правильно вопреки правилу. Означает ли это, что динамическая привязка может переопределить скрытие имени в C++? Дело в том, что если я изменю тип bp
на Derived*
, правило скрытия вступит в силу, произнося ошибку компиляции:
'Derived::fcn': функция не принимает 0 аргументов
Не могли бы вы помочь мне объяснить явление? В частности, может ли динамическая привязка переопределить скрытие имени, как я предполагал? Если да, то почему переопределение не работает, если указатель указывает на производный класс? Спасибо.
Derived d; d.Base::fcn();
- person Ben Voigt   schedule 20.02.2019