Considere el siguiente código:¿Cuándo debería restringir el acceso a una función virtual en una clase derivada?
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()
}
He oído dos diferentes escuelas de pensamiento sobre el asunto:
1) Deja la accesibilidad al igual que la clase base, ya que los usuarios podrían utilizar para obtener acceso static_cast de todas formas.
2) Haga las funciones lo más privadas posible. Si los usuarios requieren a-> Foo() pero no b-> Foo(), entonces Derived :: Foo debe ser privado. Siempre se puede hacer público si es necesario.
¿Hay alguna razón para preferir una u otra?
Este diseño es muy contrario a la intuición por las razones que menciona. Aconsejaría que no lo haga a menos que encuentre un escenario que solo pueda resolverse de esta manera. –
Si su intención es restringir _direct_ el uso de la clase derivada (por ejemplo, el patrón de fábrica), entonces la privacidad protegida o privada es la forma más adecuada (en lugar de restringir determinados métodos) – user396672