虽然它在C++中是被禁止的,但我仍然想要访问库中实现的类的非虚拟成员函数。如何访问类中的非虚拟私有成员函数?
通常情况下,这是不可能的,但是有没有破解?
我知道一些黑客有关访问虚拟私人功能,但似乎没有非虚拟的。
这是问题的一个例子:
class A
{
private:
void func(void);
};
能FUNC被A类之外访问?
虽然它在C++中是被禁止的,但我仍然想要访问库中实现的类的非虚拟成员函数。如何访问类中的非虚拟私有成员函数?
通常情况下,这是不可能的,但是有没有破解?
我知道一些黑客有关访问虚拟私人功能,但似乎没有非虚拟的。
这是问题的一个例子:
class A
{
private:
void func(void);
};
能FUNC被A类之外访问?
这取决于你准备接受什么样的丑陋。我做几乎任何事情,以避免这种脆弱两轮牛车,而从未做过这样即使用于调试/故障排除商业代码什么,但绕过抛出典型的建议包括:
#define private public
包括定义头前该类将被“黑客攻击”(请参阅注释 - 可能是未定义行为)#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 A
与func()
实现文件包括<iostream>
和调用std::cout << "x\n";
,但怀疑有潜力用于显示停止名称空间/符号冲突问题,给出具有复杂包含和内容的真实头文件和实现文件。
'#define private public'可能会影响类布局并导致编译单元之间不匹配。它肯定违反了一个定义规则,并给出了正式的未定义行为。诚然,对这个问题的任何答案都可能涉及UB,但最好还是明确提出警告。 –
我认为重新定义任何保留的关键字是正式的UB.I实际上已经看到这在一个相对较大的C++项目的生产代码,虽然... – juanchopanza
@BenVoigt:我已经在上面添加了相应的评论,欢呼声。 –
你不能打电话给外面的私人功能
确切地说。如果有解决方法,将某些方法私有化是毫无意义的。 –
即使存在使用好友类的后门程序,您也不应该在班级之外访问私人成员功能。使用朋友作为最后的手段。
除非你想尝试这个学术目的,我没有看到你为什么要这样做的原因。
这不是不可能的。这就是'朋友'的意思。 –
[在C++中调用私有方法]可能的重复(http://stackoverflow.com/questions/6873138/calling-private-method-in-c)(这要求专门访问非虚拟私有方法,我发现这个通过在谷歌搜索“stackoverflow C++访问私有方法”。第二次打击,它并不真的很难。) – jogojapan
@CaptainObvlious:我*认为*这是隐含的问题,该类不能编辑授予额外的友谊,但它可能是Lane只是不知道那个选项.... –