访问受保护方法的方法指针?

BCS*_*BCS 13 c++ specifications protected

这段代码:

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

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

给出了这个错误:

t.cpp: In member function 'void D::Bar()':
Line 3: error: 'void B::Foo()' is protected
Run Code Online (Sandbox Code Playgroud)
  • 为什么我可以调用受保护的方法但不能使用其地址?
  • 有没有办法从派生类中标记完全可访问的内容,而不是只能从派生类所述派生类中访问?

顺便说一下:这看起来很相关,但是我正在寻找一个参考指标或类似内容的地方(希望这将导致如何按照我期望的方式工作).

Naw*_*waz 20

您可以通过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!
  }
Run Code Online (Sandbox Code Playgroud)

请参阅ideone上的错误:http://www.ideone.com/P26JT

  • @Prasoon:*人们希望海报能够发布完整的答案*......我会说"期待很好".但我回答的程度我知道. (3认同)

ham*_*mar 5

这是因为派生类的对象只能访问基类的受保护成员(如果它是同一个对象).允许您获取受保护成员函数的指针将使得无法保持此限制,因为函数指针不会随身携带任何此类信息.