次のコードを検討してください。
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()
}
この問題について、私は 2 つの異なる考え方を聞いたことがあります。
1) ユーザーは static_cast を使用してアクセスできるため、基本クラスと同じようにアクセシビリティを維持します。
2) 関数をできるだけ非公開にする。ユーザーが a->Foo() を必要とし、b->Foo() を必要としない場合、Derived::Foo は非公開にする必要があります。必要に応じていつでも公開できます。
どちらか一方を好む理由はありますか?