You can take the address through D
by writing &D::Foo
, instead of &B::Foo
.
See this compiles fine : http://www.ideone.com/22bM4
But this doesn't compile (your code) : http://www.ideone.com/OpxUy
Why can I call a protected method but not take its address?
You cannot take its address by writing &B::Foo
because Foo
is a protected member, you cannot access it from outside B
, not even its address. But writing &D::Foo
, you can, because Foo
becomes a member of D
through inheritance, and you can get its address, no matter whether its private, protected or public.
&B::Foo
has same restriction as b.Foo()
and pB->Foo()
has, in the following code:
void Bar() {
B b;
b.Foo(); //error - cannot access protected member!
B *pB = this;
pB->Foo(); //error - cannot access protected member!
}
See error at ideone : http://www.ideone.com/P26JT
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…