如何访问类中的非虚私有成员函数
How to access a non-virtual private member function in a class?
尽管这在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 A
与func()
实现文件,包括<iostream>
和调用std::cout << "xn";
,但怀疑有潜在的显示停止命名空间/符号冲突问题给出现实的头文件和实现文件复杂的包括和内容。
不能在类之外调用私有函数
不应该在类之外访问私有成员函数,即使存在使用友类的后门。把朋友当作最后的手段。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针