Существует очень редкий случай использования защищенного наследования. Здесь вы хотите использовать ковариация :
struct base {
virtual ~base() {}
virtual base & getBase() = 0;
};
struct d1 : private /* protected */ base {
virtual base & getBase() {
return this;
}
};
struct d2 : private /* protected */ d1 {
virtual d1 & getBase () {
return this;
}
};
Предыдущий фрагмент кода пытался скрыть свой базовый класс и обеспечивать контролируемую видимость баз и их функций по любой причине, предоставляя функцию "getBase".
Однако в структуре d2
произойдет сбой, поскольку d2
не знает, что d1
является производным от base
. Таким образом, covariance
не будет работать. Выходом из этого является получение их защищенными, так что наследование видно в d2.
Подобный пример использования этого - когда вы наследуете std::ostream
, но не хотите, чтобы случайные люди писали в ваш поток. Вы можете предоставить виртуальную getStream
функцию, которая возвращает std::ostream&
. Эта функция может подготовить поток к следующей операции. Например, установка определенных манипуляторов.
std::ostream& d2::getStream() {
this->width(10);
return *this;
}
logger.getStream() << "we are padded";