Допустим, у меня есть первый класс
class Walker {
public:
Walker();
virtual ~Walker();
virtual void Step();
};
Затем второй, вытекающий из первого
class Mecha : public Walker {
public:
Mecha();
virtual ~Mecha();
private:
virtual void Step();
};
В том, что private
модификатор включен Step()
любой полезный? Mecha::Step()
все еще можно назвать Walker::Step()
не так ли? Разве не должно быть предупреждения, поскольку я пытаюсь изменить природу суперкласса через определение его подкласса?
Может ли подкласс влиять на видимость виртуальных методов?
Да, они могут изменить видимость методов.
В том, что
private
модификатор включенStep()
полезно?
Зависит. Это в первую очередь влияет на клиента кода.
Увеличение видимости (например, переход от protected
в public
) может быть полезен, но поставляется с предупреждением об его использовании — разработчик интерфейса базового класса хотел, чтобы этот метод был внутренним по отношению к иерархии, делая его внешним, мог что-то сломать … (возможные реализации шаблонный шаблон приходит на ум).
В принципе, изменение видимости не влияет на полиморфную природу virtual
Метод — он все еще переопределяется в производном классе. Это, однако, влияет на абонента. Изменение метода на private
ограничивает клиентский код вызовом метода из указателя или ссылки на базовый класс, а не на производный.
Mecha m;
//m.Step(); // fails to compile
Walker& w = m;
w.Step(); // still calls Mecha::Step()
Далее, изменив метод на protected
позволит другим подклассам вызывать его.
Нет, делая Step()
private
делает не изменить полиморфное поведение. Там нет никакого предупреждения, так как язык явно позволяет это. (Но учтите, что Java этого не делает).
Но это делает не позволяйте вам писать Mecha::Step()
явно, если вы не кодируете это в функции-члена Mecha
,