2013-05-29 198 views
-2

虽然它在C++中是被禁止的,但我仍然想要访问库中实现的类的非虚拟成员函数。如何访问类中的非虚拟私有成员函数?

通常情况下,这是不可能的,但是有没有破解?

我知道一些黑客有关访问虚拟私人功能,但似乎没有非虚拟的。

这是问题的一个例子:

class A 
{ 
private: 
    void func(void); 
}; 

能FUNC被A类之外访问?

+2

这不是不可能的。这就是'朋友'的意思。 –

+1

[在C++中调用私有方法]可能的重复(http://stackoverflow.com/questions/6873138/calling-private-method-in-c)(这要求专门访问非虚拟私有方法,我发现这个通过在谷歌搜索“stackoverflow C++访问私有方法”。第二次打击,它并不真的很难。) – jogojapan

+0

@CaptainObvlious:我*认为*这是隐含的问题,该类不能编辑授予额外的友谊,但它可能是Lane只是不知道那个选项.... –

回答

2

这取决于你准备接受什么样的丑陋。我做几乎任何事情,以避免这种脆弱两轮牛车,而从未做过这样即使用于调试/故障排除商业代码什么,但绕过抛出典型的建议包括:

  • #define private public包括定义头前该类将被“黑客攻击”(请参阅​​注释 - 可能是未定义行为)
  • 寻找模板成员函数然后专门创建后门 - 专用版本可以访问私有成员
  • 您知道函数的实现您可以当然创建一个类似的对象,其中函数不是私有的,然后使用cast来调用它(这有同一种倾向未定义行为作为#define private public破解上面,因为它们都危险创建A般类不同的实际数据成员布局)

对于这最后的一个例子,如果你”已经得到了访问的.cc /的.cpp/.whatever实现文件,你可能有时能够做到像somethign ...

#include "a.h" 
#include "a.cc" // normally link a.o to get this - I couldn't be bothered 

namespace Hack 
{ 
    class A { public: void func(); }; 

    #include "a.cc" // you do have to include this one though... 
} 

int main() 
{ 
    A a; 
    ((Hack::A&)a).func(); 
} 

...我得到了工作的简单class Afunc()实现文件包括<iostream>和调用std::cout << "x\n";,但怀疑有潜力用于显示停止名称空间/符号冲突问题,给出具有复杂包含和内容的真实头文件和实现文件。

+2

'#define private public'可能会影响类布局并导致编译单元之间不匹配。它肯定违反了一个定义规则,并给出了正式的未定义行为。诚然,对这个问题的任何答案都可能涉及UB,但最好还是明确提出警告。 –

+0

我认为重新定义任何保留的关键字是正式的UB.I实际上已经看到这在一个相对较大的C++项目的生产代码,虽然... – juanchopanza

+0

@BenVoigt:我已经在上面添加了相应的评论,欢呼声。 –

2

你不能打电话给外面的私人功能

+2

确切地说。如果有解决方法,将某些方法私有化是毫无意义的。 –

2

即使存在使用好友类的后门程序,您也不应该在班级之外访问私人成员功能。使用朋友作为最后的手段。

除非你想尝试这个学术目的,我没有看到你为什么要这样做的原因。