Когда следует ограничивать доступ к виртуальной функции в производном классе?

Рассмотрим следующий код:

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

Есть ли причина предпочесть тот или иной вариант?

5
задан iammilind 27 April 2012 в 06:47
поделиться