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().
更新:我知道这不是一个好的设计,并且私有应该被隐藏.问题只是要知道如何将类放入编译器的内存中.
我知道怎么弄
a!Run Code Online (Sandbox Code Playgroud)A* x = new A(5); cout << ((int*)x)[2]; // returns 5;
这是一个黑客!几乎与它不可移植一样,此代码会导致未定义的行为,恰好产生您期望的结果.这并不意味着它会在另一个系统上产生相同的结果,或者甚至在编译器选择以不同方式实现该类时在同一系统上产生相同的结果.
没有办法访问私有函数,除非有人给你一个引用它的成员函数的指针,或者声明你的函数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)
| 归档时间: |
|
| 查看次数: |
1630 次 |
| 最近记录: |