如何访问类中的非虚私有成员函数

How to access a non-virtual private member function in a class?

本文关键字:函数 成员 何访问 访问      更新时间:2023-10-16

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

通常情况下,这是不可能的,但有什么方法吗?

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

下面是这个问题的一个例子:

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

可以在类A之外访问函数吗?

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

  • #define private public在包含定义要被"攻击"的类的头文件之前(见注释-可能的未定义行为)
  • 查找模板成员函数,然后对其进行专门化以创建后门——专门化版本可以访问私有成员
  • 在你知道函数的实现中,你当然可以创建一个类似的对象,其中函数不是私有的,然后使用强制转换来调用它(这与上面的#define private public黑客有相同的未定义行为倾向,因为它们都有创建具有不同实际数据成员布局的A类的风险)

对于最后一个例子,如果您已经访问了.cc/.cpp/。无论实现文件是什么,您有时都可以做像…

#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 << "xn";,但怀疑有潜在的显示停止命名空间/符号冲突问题给出现实的头文件和实现文件复杂的包括和内容。

不能在类之外调用私有函数

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