为什么无法获取指向基类的受保护方法的指针
Why is it impossible to get a pointer to a protected method of the base class?
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
相关文章:
- 覆盖作为另一个类的好友的虚拟受保护方法
- 无法在赋值运算符中访问基类的受保护方法
- 如何按类型启用受保护的方法
- 用受保护的继承指向基类方法
- 受保护的方法在 c++ 中继承时可以成为私有方法
- std::异步不能调用受保护的基类方法
- Boost单元测试夹具继承测试类,是否可以访问受保护的方法
- 在派生类中定义自定义返回类型的受保护方法
- 有什么方法可以在工会内部获得受保护的声明吗
- 通过此指针调用受保护的基类方法,该指针投射到派生类(C++)中的基类
- 访问受保护成员的公共方法
- C++:重写由另一个方法调用的受保护方法
- 这种使用虚拟受保护方法扩展库的方式是否安全
- 派生类是否可以访问作为内部类的好友的父类的受保护内部类的私有方法
- 为什么无法从模板方法访问此类自己的受保护成员?
- 从基类的静态模板方法中调用继承类的受保护 ctor 失败
- 在C++中为成员对象调用受保护的方法
- 为什么无法获取指向基类的受保护方法的指针
- 模板函数调用类中的受保护方法
- 访问受保护方法的方法指针