cesso ao ponteiro do método para o método protegid

Este código:

class B {
 protected:
  void Foo(){}
}

class D : public B {
 public:
  void Baz() {
    Foo();
  }
  void Bar() {
    printf("%x\n", &B::Foo);
  }
}

dá este erro:

t.cpp: In member function 'void D::Bar()':
Line 3: error: 'void B::Foo()' is protected
Por que posso chamar um método protegido, mas não usar o endereç Existe uma maneira de marcar algo totalmente acessível a partir de classes derivadas, em vez de apenas acessível a partir de classes derivadas em relação à referida classe derivada?

BTW:Isso parece relacionado mas o que estou procurando é uma referência a onde isso é mencionado nas especificações ou algo parecido (e espero que isso leve a como fazer as coisas funcionarem da maneira que eu esperava).

questionAnswers(6)

yourAnswerToTheQuestion