C++ 能够使用指向函数的指针调用外部类的私有方法

C++ 能够使用指向函数的指针调用外部类的私有方法,c++,private,member-function-pointers,C++,Private,Member Function Pointers,根据最近的一个例子,我能够使用函数指针从另一个类Bar调用私有方法Foo::Foo(),如下所示(另请参见) #包括 模板 结构条 { typedef void(T::*F)(); 酒吧(T&T,F):T(T),func(F) { } void运算符()() { (t.*func)(); } F func; T&T; }; 模板 福班 { 私人: void foo() { 标准::cout是的,这是允许的,而且有效 C++可以防止意外,而不是故意规避 (欺诈) 当然,不能直接/轻易地调用类外的

根据最近的一个例子,我能够使用函数指针从另一个类
Bar
调用私有方法
Foo::Foo()
,如下所示(另请参见)

#包括
模板
结构条
{
typedef void(T::*F)();
酒吧(T&T,F):T(T),func(F)
{
}
void运算符()()
{
(t.*func)();
}
F func;
T&T;
};
模板
福班
{
私人:
void foo()
{

标准::cout是的,这是允许的,而且有效

C++可以防止意外,而不是故意规避 (欺诈)

当然,不能直接/轻易地调用类外的私有方法,但是如果你做了足够的努力,C++会允许它。

< P>是的,它是有效的。
Bar.operator()
不管指针是如何初始化的,只要它指向正确的函数

:

#包括
结构A{
受保护的:
void hidden(){std::coutC++标准说

11.1类的成员可以是
(1.1)-私有;也就是说,它的名称只能由声明它的类的成员和朋友使用

i、 e.访问说明符应用于名称,而不是可执行代码。仔细想想,这很有意义,因为访问说明符是编译时构造。

这很重要

头文件

class A;
typedef int (A::*handler)(int x);
struct handler_pair {
    int code,
    handler fn
}

class A {
...
private:
  int onGoober(int x);
  int onGomer(int x);
};
源文件

handler_pair handler_map[] = {
    {0, &A::onGoober},          // these will complain about the method being private
    {1, &A::onGomer}
};
将处理程序映射更改为类中的静态成员并以这种方式初始化可以避免投诉


获取成员函数地址的位置很重要。

当然,为什么不应该?分配指针时检查了访问权限。这与公开:void buz(){foo();}没有什么区别
这里不涉及规避,而是直接使用指针。@重复数据消除程序规避私有数据成员。@重复数据消除程序
(t.*func)(;
--规避,私有成员-->void foo().I'm missing something?@PranitKothari
Foo
是一个指向其私有成员函数的指针,这显然是允许的。所有
Bar
知道的是,它被传递了一个指向某个对象的成员函数的指针,此时访问控制不会出现在画面中。您只需调用该对象即可通过调用
Bar::operator()进行ng
是的,但这样做只是因为它碰巧是用一个指向私有成员函数的指针初始化的。OP似乎对访问控制的工作原理感到困惑,而你的回答暗示他在做一些鬼鬼祟祟的事情来规避访问控制,而实际上根本没有。是的,对于标准引用。应该注意的是,它不是选择类
Foo
Bar
的构造函数提供指向函数的指针。如果没有内部的帮助,Bar将无法从外部调用
Foo::Foo()
class A;
typedef int (A::*handler)(int x);
struct handler_pair {
    int code,
    handler fn
}

class A {
...
private:
  int onGoober(int x);
  int onGomer(int x);
};
handler_pair handler_map[] = {
    {0, &A::onGoober},          // these will complain about the method being private
    {1, &A::onGomer}
};