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