Несмотря на все призывы объявить виртуального участника приватным, этот аргумент не выдерживает критики. Часто переопределение производного класса виртуальной функции должно вызывать версию базового класса. Не может, если заявлено private
:
class Base
{
private:
int m_data;
virtual void cleanup() { /*do something*/ }
protected:
Base(int idata): m_data (idata) {}
public:
int data() const { return m_data; }
void set_data (int ndata) { m_data = ndata; cleanup(); }
};
class Derived: public Base
{
private:
void cleanup() override
{
// do other stuff
Base::cleanup(); // nope, can't do it
}
public:
Derived (int idata): base(idata) {}
};
Вы должны объявить метод базового класса protected
.
Затем вы должны воспользоваться уродливым приемом, указав в комментарии, что метод следует переопределить, но не вызывать.
class Base
{
...
protected:
// chained virtual function!
// call in your derived version but nowhere else.
// Use set_data instead
virtual void cleanup() { /* do something */ }
...
Таким образом, рекомендация Херба Саттера № 3 ... Но лошадь все равно вышла из конюшни.
Когда вы объявляете что- protected
то, вы неявно доверяете автору любого производного класса понимать и правильно использовать защищенные внутренние компоненты, точно так же, как friend
объявление подразумевает более глубокое доверие для private
членов.
Пользователи, которые плохо себя ведут из-за нарушения этого доверия (например, получают ярлык «невежественный» из-за того, что не удосуживаются читать вашу документацию) должны винить только себя.
Обновление : у меня есть отзывы, в которых утверждается, что вы можете «связать» реализации виртуальных функций таким образом, используя частные виртуальные функции. Если так, то я бы обязательно это увидел.
Компиляторы C ++, которые я использую, определенно не позволяют реализации производного класса вызывать реализацию частного базового класса.
Если бы комитет C ++ ослабил «частный», чтобы разрешить этот конкретный доступ, я бы полностью сосредоточился на частных виртуальных функциях. В настоящее время нам все еще советуют запирать дверь сарая после кражи лошади.