Допустим, у меня есть интерфейс слушателя, определенный как:
class Listener
{
public:
virtual void doSomething(void) = 0;
}
и абстрактный класс, который публично наследует из моего интерфейса:
class AbstractBase: public Listener
{
public:
virtual void doSomething(void){ ...do something }
}
Мой производный класс наследует от моего AbstractBase
используя защищено наследование:
class Derived: protected AbstractBase
{
public:
Derived(Caller &c){ c.register(this); }
}
Мой класс Caller уведомляет слушателей, которые регистрируются на события:
class Caller
{
public:
void register(Listener *listenerPtr){...add listenerPtr to some container }
void raiseEvent(){...loop over registered listeners and call listenerPtr->doSomething();}
}
Затем я использую классы следующим образом:
int main(void)
{
Caller caller;
Derived derived(caller); // derived registers with caller in its constructor
caller.raiseEvent();
}
В приведенном выше коде я вижу, что raiseEvent()
разрешено вызывать listener.doSomething()
.Однако, поскольку я зарегистрировал экземпляр Derived
в качестве прослушивателя, не должен ли doSomething()
быть защищен (и, следовательно, не вызываться из Caller
), поскольку он наследует свою реализацию от AbstractBase через защищенное наследование?