В чем разница между объявлением виртуальной функции частным, защищенным и общедоступным в базовом объекте?
Разница в том, что виртуальная функция private
может быть вызвана только из базового класса. Это может быть полезно, если функция не является частью интерфейса внешнего класса и используется только базовым классом. Таким образом, пользователи вызывают член (некоторого другого) базового класса, и этот член вызывает виртуальную функцию. Например:
class Base {
virtual void stage1()=0; // derived classes override this
virtual void stage2()=0;
public:
void run() { stage1(); stage2(); } // users call this
};
Более того, существует точка зрения, что вы не должны делать свои виртуальные функции public
вообще, потому что тот факт, что они виртуальные, является внутренним компонентом класса и его подклассов, и пользователи не должны знать об этом. Редко бывает, что одна и та же функция должна быть переопределена и вызвана из внешнего кода. Это позволяет базовому классу контролировать, какие (виртуальные) функции могут быть вызваны из какого (не виртуального) общедоступного метода, что упрощает обслуживание.
Дополнительные сведения см. В этой статье Херба Саттера:
... каждая [общедоступная] виртуальная функция выполняет две задачи: определяет интерфейс, потому что он общедоступен ...; и он определяет детали реализации, а именно внутренне настраиваемое поведение ... То, что общедоступная виртуальная функция по своей сути выполняет две существенно разные задачи, является признаком того, что она плохо разделяет задачи и что мы должны рассмотреть другой подход. Что, если мы хотим отделить спецификацию интерфейса от спецификации настраиваемого поведения реализации?
...
Таким образом, предпочтите сделать виртуальные функции базового класса закрытыми (или защищенными, если это действительно необходимо). Это разделяет проблемы интерфейса и реализации, что стабилизирует интерфейсы и упрощает принятие решений о реализации и последующий рефакторинг.
Однако я не могу сказать, действительно ли это широко используется ...
person
Petr
schedule
21.09.2015
private
в Java. Я удалил упоминания об этом в вашем вопросе. - person Sotirios Delimanolis   schedule 21.09.2015overriding a private function to a public one from base object is allowed in C++ since Visual Studio produces 0 warning
будьте осторожны, делая подобные предположения. То, что было выдано 0 предупреждений, не означает, что это разрешено в C ++, это означает, что это разрешено в Visual Studio. И даже тогда может появиться предупреждение, если уровень предупреждения повышен (я точно не знаю). В любом случае, дело в том, что даже если один компилятор с этим справляется, это не значит, что подойдет другой. Настоящим авторитетом здесь является стандарт C ++. - person Steve   schedule 21.09.2015