如何在类中访问非虚拟私有成员函数?

时间:2013-05-29 05:25:46

标签: c++ g++

虽然在C ++中是禁止的,但我仍然希望访问一个在库中实现的类的非虚拟成员函数。

通常情况下,这是不可能的,但有没有黑客攻击?

我知道一些与访问虚拟私有函数有关的黑客攻击,但对于非虚拟函数似乎没有。

以下是问题的一个示例:

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

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

3 个答案:

答案 0 :(得分:2)

你不能在课堂外调用私人功能

答案 1 :(得分:2)

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

  • #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";,但怀疑有可能显示停止名称/符号冲突问题给出了具有复杂包含和内容的实际标题和实现文件。

答案 2 :(得分:2)

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

除非你想为学术目的而尝试这个,否则我没有理由你想要这样做。