Рассмотрим следующий код:Когда вы должны ограничивать доступность к виртуальной функции в производном классе?
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 должен быть закрытым. Его всегда можно обнародовать, если и когда это необходимо.
Есть ли причина предпочесть тот или иной?
Этот дизайн очень противоречит интуитивно понятным причинам. Я бы посоветовал это, если вы не встретите сценарий, который может быть разрешен только таким образом. –
Если ваше намерение ограничить использование _direct_ производного класса (например, заводского шаблона), то защищенный или закрытый _inheritance_ является более подходящим способом (вместо ограничения определенных методов) – user396672