Объединение ответов Давида Родригеса - Дрибея и Лучиана Григоре:
Да, пример в вопросе работает, однако, как указывает Дэвид, защищенные члены не доступны напрямую через базовый класс. Вы получаете доступ к защищенным членам только при доступе через Derived
, у вас нет доступа к тем же участникам при доступе через Base
.
Другими словами, защищенные члены базы обрабатываются так, как если бы они были частными членами производного, и, таким образом, друзья могут видеть их, но если вы преобразуете в базовый класс, отношения между друзьями отсутствуют, и, следовательно, защищенные члены больше недоступны.
Вот пример, который проясняет разницу:
class MyFriend {
Derived _derived;
void test() {
bool thisWorks = _derived.pub;
bool thisAlsoWorks = _derived.prot;
Base &castToBase = _derived;
bool onlyPublicAccessNow = castToBase.pub;
// Compiler error on next expression only.
// test.cpp:13: error: `bool Base::prot' is protected
bool noAccessToProtected = castToBase.prot;
}
};