Глядя на ваш дизайн, я вижу, что никто не может вызвать derived::a
напрямую, но только через интерфейс base
.
Есть ли смысл? Учтите, что когда у нас есть экземпляр derived
, мы всегда можем повысить его базу, поэтому, если
derived d;
, а d.a()
не будет компилироваться, мы всегда можем сделать
base & b = d;
b.a(); //which actually calls derived::a
Другими словами: derived::a
- это не , что, в конце концов, приватно, и я бы не одобрил этот дизайн, который может сбить пользователя с толку.
Все изменится, есличлены * private в derived
также являются приватными в base
: на этот раз ясно, что их просто нельзя вызвать напрямую, вне base
или derived
.
Допустим, у нас есть пара функций, и мы хотим, чтобы они вызывались условно, в соответствии со значением, передаваемым в качестве аргумента третьему:
struct base
{
void dosomething(bool x)
{
if(x)
{
do_this();
}
else
{
do_that();
}
}
private:
virtual void do_this(){}
virtual void do_that(){}
};
Таким образом, производный класс можетбыть похожим на:
struct derived : base
{
private:
void do_this() override { }
void do_that() override { }
};
, и никакие другие классы не могут вызывать их, если только он сам не расширил base
:
derived d;
d.dosomething(true); //will call do_this() in derived
d.dosomething(false); //will call do_that() in derived
d.do_that() //won't compile