为什么不能存储基类的函数指针?

Pas*_*cal 6 c++ function-pointers

以下代码给出了void b() { m = &A::a; };声明A::a()受保护的编译错误.(它是 - 但这应该没问题)
然而编译器在我写的时候并不关心B::a().即使两者都意味着我想要的相同,A::a()因为它明确表示a()在A中定义.

那么禁止的原因A::a()什么?
编辑
也许有人可以找到一个例子,如果A::a()允许的话会有问题B::b().如果有这样的例子,我会将其标记为问题的答案.
/编辑

#include <iostream>
#include <iomanip>
#include <string>
#include <cstdio>

class A {
protected:
  void a(){ std::cout << "A::a()" << std::endl; };
};

typedef void (A::*f)();
class B : public A {
public:
  void b() { m = &A::a; }; // wont compile
  // void b() { m = &B::a; }; // works fine
  void c() { (this->*m)(); };
protected:
  f m;
};

int main(){
  B b;
  b.b();
  b.c();
}

// compile with
// g++ -Wall main.cpp -o main
Run Code Online (Sandbox Code Playgroud)

代码说明:
在BI中想要存储一个函数指针,指向A中的方法,以便稍后调用它B::c().是的,这也发生在现实生活中.:-)

vis*_*tor 1

原因应该类似于为什么你不能在 B 中执行此操作:

class B: public A
{
    //...
    void foo(A& x) {
        x.a(); //error
    }

    void foo(B& x) {
        x.a(); //OK
    }
};
Run Code Online (Sandbox Code Playgroud)

保护并不意味着 B 可以访问任何类的 A 部分,只要它是 A / 从 A 派生即可。受保护的内容仅适用于 B 的该实例和其他实例。