为什么无法获取指向基类的受保护方法的指针

Why is it impossible to get a pointer to a protected method of the base class?

本文关键字:受保护 方法 指针 基类 获取 取指 为什么      更新时间:2023-10-16
class A {
public:
   A() {auto tmp = &A::foo;}
protected:
   void foo() {}
};
class B : public A {
public:
   B() {auto tmp = &A::foo;}
};

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

"A::

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

这是为什么,理由是什么?有没有办法规避这一点(如果我需要该指针进行回调,std::function等(?

这是为什么,理由是什么?

通常,派生类

只能访问同一派生类的受保护成员,而不能访问基类本身或具有相同基类的任意类的受保护成员。因此,B可以通过B访问A的受保护成员,但不能直接通过A

有没有办法规避这一点?

继承的成员也是 B 的成员,可以这样访问:

auto tmp = &B::foo;

如果你能够获取指向A::foo的指针,你可以使用它来调用foo 对类型为 A 或从 A 派生的 C 类型的对象:

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

取而代之的是,获取指向B::foo的指针;这很好,因为您只能在类型B,您自己的类的对象上使用它。

大概是为了安全。 如果你能得到一个指向该成员的指针,并在没有某种警钟响起的情况下将其提供给绝对任何人,那将是有风险的。

这是一个解决方法(其他人可能知道得更好(:

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

编辑 - 认为您可能需要使用 A::foo,但您甚至不需要它。 工作没有。 看:

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

你可以

通过B访问它,即:

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

您无法从外部访问&A::Foo B ,因为它受到保护,但您可以通过继承(因为Foo通过继承成为B的成员(,即通过调用&B::Foo