Рассмотрим следующий код:
class Base
{
public:
virtual void Foo() {}
};
class Derived : public Base
{
private:
void Foo() {}
};
void func()
{
Base* a = new Derived;
a->Foo(); //fine, calls Derived::Foo()
Derived* b = new Derived;
// b->Foo(); //error
static_cast<Base*>(b)->Foo(); //fine, calls Derived::Foo()
}
Я слышал две разные точки зрения по этому поводу:
1) Оставьте доступность такой же, как у базового класса, поскольку пользователи в любом случае могут использовать static_cast для получения доступа.
2) Сделайте функции максимально приватными. Если пользователям требуется a-> Foo (), но не b-> Foo (), тогда Derived :: Foo должен быть закрытым. Его всегда можно обнародовать, если и когда это потребуется.
Есть ли причина предпочесть одно или другое?