2016-08-12 2 views
3

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

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

+1

По касательной: это, вероятно, хорошее время, чтобы услышать о ['override'] (http://en.cppreference.com/w/cpp/language/override) и [' final'] (http://en.cppreference.com/w/cpp/language/final) спецификаторы :) – Quentin

ответ

1

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

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

Возможно, это private модификатор на Step()?

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

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

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

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

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

+0

Выполнение шага() на Mecha private обеспечивает интерфейс, который будет использоваться. Это может быть полезно для обеспечения написания более общего кода, если у вас будет доступ к Mecha и Walker, тогда как класс Mecha должен стать деталью реализации в долгосрочной перспективе. – JVApen

3

No, making Step()privateне изменить полиморфное поведение. Предупреждений нет, поскольку язык явно разрешает это. (Но обратите внимание, что Java нет).

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

Смежные вопросы