尽管在 C++ 中是禁止的,但我仍然想访问在库中实现的类的非虚拟成员函数。
通常,这是不可能的,但是有什么黑客吗?
我知道一些与访问虚拟私有功能相关的技巧,但似乎没有针对非虚拟功能的技巧。
这是问题的一个例子:
class A
{
private:
void func(void);
};
func可以在A类之外访问吗?
你不能在课外调用私有函数
这取决于你准备接受什么样的丑陋。我几乎做了任何事情来避免这种脆弱的黑客行为,并且从未在商业代码中做过这样的事情,即使是出于调试/故障排除的目的,但被抛出的典型建议包括:
#define private public
在包含定义要“被黑”的类的标头之前(请参阅注释 - 可能是未定义的行为)#define private public
上面的 hack 具有相同的未定义行为倾向,因为它们都有创建A
-像具有不同实际数据成员布局的类)最后一个例子,如果你可以访问 .cc/.cpp/.whatever 实现文件,你有时可以做一些事情,比如......
#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";
,但怀疑存在显示停止命名空间/符号冲突问题的可能性,因为现实的头文件和实现文件具有复杂的包含和内容。
即使存在使用友元类的后门,也不应访问类外的私有成员函数。使用朋友作为最后的手段。
除非您想出于学术目的尝试此操作,否则我看不出您要这样做的原因。