虽然在C ++中是禁止的,但我仍然希望访问一个在库中实现的类的非虚拟成员函数。
通常情况下,这是不可能的,但有没有黑客攻击?
我知道一些与访问虚拟私有函数有关的黑客攻击,但对于非虚拟函数似乎没有。
以下是问题的一个示例:
class A
{
private:
void func(void);
};
可以在A类之外访问func吗?
答案 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)
即使有使用好友类的后门,也不应该访问类外的私有成员函数。使用朋友作为最后的手段。
除非你想为学术目的而尝试这个,否则我没有理由你想要这样做。