为什么不可能获得指向基类的受保护方法的指针?

Vio*_*ffe 7 c++ inheritance

class A {
public:
   A() {auto tmp = &A::foo;}
protected:
   void foo() {}
};

class B : public A {
public:
   B() {auto tmp = &A::foo;}
};
Run Code Online (Sandbox Code Playgroud)

A编译没问题.类B产生编译错误:

'A :: foo':无法访问类'A'中声明的受保护成员

为什么这样,理由是什么?有没有办法绕过这个(如果我需要指针回调std::function等)?

eca*_*mur 2

如果您能够获取指向 的指针A::foo,则可以使用它来调用类型或派生自 的类型foo的对象:ACA

class B : public A {
public:
    void xx(A a) { auto tmp = &A::foo; a.*tmp(); }  // illegal
}
Run Code Online (Sandbox Code Playgroud)

相反,取一个指向B::foo;的指针。这很好,因为您只能在类型为B您自己的类的对象上使用它。