Вы можете взять адрес через D
, написав &D::Foo
вместо &B::Foo
.
См. Это хорошо компилируется: http://www.ideone.com/22bM4
Но это не компилируется (ваш код): http://www.ideone.com/OpxUy
Почему я могу вызвать защищенный метод, но не получить его адрес?
Вы не можете получить его адрес, написав &B::Foo
, потому что Foo
является защищенным участником, вы не можете получить к нему доступ извне B
, даже его адрес. Но писать &D::Foo
вы можете, потому что Foo
становится членом D
посредством наследования, и вы можете получить его адрес, независимо от того, является ли он личным, защищенным или общедоступным.
&B::Foo
имеет те же ограничения, что и b.Foo()
и pB->Foo()
, в следующем коде:
void Bar() {
B b;
b.Foo(); //error - cannot access protected member!
B *pB = this;
pB->Foo(); //error - cannot access protected member!
}
Смотрите ошибку в ideone: http://www.ideone.com/P26JT