Может ли подкласс влиять на видимость виртуальных методов?

Допустим, у меня есть первый класс

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()не так ли? Разве не должно быть предупреждения, поскольку я пытаюсь изменить природу суперкласса через определение его подкласса?

3

Решение

Может ли подкласс влиять на видимость виртуальных методов?

Да, они могут изменить видимость методов.

В том, что private модификатор включен Step() полезно?

Зависит. Это в первую очередь влияет на клиента кода.

Увеличение видимости (например, переход от protected в public) может быть полезен, но поставляется с предупреждением об его использовании — разработчик интерфейса базового класса хотел, чтобы этот метод был внутренним по отношению к иерархии, делая его внешним, мог что-то сломать … (возможные реализации шаблонный шаблон приходит на ум).

В принципе, изменение видимости не влияет на полиморфную природу virtual Метод — он все еще переопределяется в производном классе. Это, однако, влияет на абонента. Изменение метода на private ограничивает клиентский код вызовом метода из указателя или ссылки на базовый класс, а не на производный.

Mecha m;
//m.Step(); // fails to compile
Walker& w = m;
w.Step(); // still calls Mecha::Step()

Далее, изменив метод на protected позволит другим подклассам вызывать его.

1

Другие решения

Нет, делая Step() private делает не изменить полиморфное поведение. Там нет никакого предупреждения, так как язык явно позволяет это. (Но учтите, что Java этого не делает).

Но это делает не позволяйте вам писать Mecha::Step() явно, если вы не кодируете это в функции-члена Mecha,

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector