-2

尽管在 C++ 中是禁止的,但我仍然想访问在库中实现的类的非虚拟成员函数。

通常,这是不可能的,但是有什么黑客吗?

我知道一些与访问虚拟私有功能相关的技巧,但似乎没有针对非虚拟功能的技巧。

这是问题的一个例子:

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

func可以在A类之外访问吗?

4

3 回答 3

2

你不能在课外调用私有函数

于 2013-05-29T05:31:22.147 回答
2

这取决于你准备接受什么样的丑陋。我几乎做了任何事情来避免这种脆弱的黑客行为,并且从未在商业代码中做过这样的事情,即使是出于调试/故障排除的目的,但被抛出的典型建议包括:

  • #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 Afunc()实现文件包括<iostream>和调用的工作std::cout << "x\n";,但怀疑存在显示停止命名空间/符号冲突问题的可能性,因为现实的头文件和实现文件具有复杂的包含和内容。

于 2013-05-29T05:34:29.003 回答
2

即使存在使用友元类的后门,也不应访问类外的私有成员函数。使用朋友作为最后的手段。

除非您想出于学术目的尝试此操作,否则我看不出您要这样做的原因。

于 2013-05-29T05:34:31.247 回答