C++通过指针访问私有功能

six*_*r24 1 c++ pointers class vtable

说我有以下内容:

class A {
private:
    int a;
    virtual int f() {return a;}
public:
    A(int t) {a = t;}
};
Run Code Online (Sandbox Code Playgroud)

现在,int A::f()如果给出指向A对象的指针,如何访问?我知道如何得到一个!

void main () {
    A* x = new A(5);
    cout << ((int*)x)[2]; // returns 5;
}
Run Code Online (Sandbox Code Playgroud)

但现在确定如何运行A :: f().

更新:我知道这不是一个好的设计,并且私有应该被隐藏.问题只是要知道如何将类放入编译器的内存中.

das*_*ght 5

我知道怎么弄a!

A* x = new A(5);
cout << ((int*)x)[2]; // returns 5;
Run Code Online (Sandbox Code Playgroud)

这是一个黑客!几乎与它不可移植一样,此代码会导致未定义的行为,恰好产生您期望的结果.这并不意味着它会在另一个系统上产生相同的结果,或者甚至在编译器选择以不同方式实现该类时在同一系统上产生相同的结果.

没有办法访问私有函数,除非有人给你一个引用它的成员函数的指针,或者声明你的函数friend:

class A;
typedef  int (A::*FPTR)();
class A {
private:
    int a;
    virtual int f() {return a;}
public:
    A(int t) {a = t;}
    FPTR get_private() { return &A::f; }
};
int main() {
    A a(123);
    FPTR fp = a.get_private();
    int res = (a.*fp)();
    cout << res << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

演示.