用指針呀,了解C++內存結構的話。
1. 對於私有成員變量,可以用指針來訪問。
2. 對於虛函數,也可以用指針來訪問。
3. 另外,對於私有成員,如果摸不准地址構造,可以先構造一個結構相似的類,然后增加一個公有函數獲得內容,然后指針轉換,並且用公有函數來訪問。
#include <stdio.h> class A { private: char *str; public: A(): str("nothing"){}; }; class B { private: char *str; public: B(): str("nothing"){}; char *get() { return str; } };
4. 最后,就是直接定義一個相似的類,然后把私有變成公有,然后強轉指針來訪問。
但是注意,只對變量有效,對函數無效。
#include <vector> #include <iostream> using namespace std; class A { public: A(int i):a(i){} private: void print() {cout<<"A"<<endl;} int a; }; class B { public: void print() {cout<<"B"<<endl;} int a; }; int main() { A a(6); B *b = (B*)&a; b->print(); cout << b->a << endl; return 0; }
對於類函數(除了上面提到虛擬函數),想要訪問,其實就要知道代碼區的分布了吧。
那么A類的foo函數和B類的foo函數,如果參數列表一致,怎么區分它們呢?用A類的一個對象調用成員函數,這個成員函數用到成員變量,怎么知道是在用這個對象的數據呢?
這個解釋,就是this指針。A類的foo(int,int)函數,已經被編譯器編譯成_foo_A*_int_int,也就是說隱含已經加入了函數所屬類的信息,調用A類對象a.foo的時候,已經在調用foo(const A * this,int,int)這個函數。
這也解釋了,為什么在成員函數內部,使用成員變量,有時候(並不是全部情況下都如此)前面加this和不加this沒有區別,編譯器已經把foo里面用到的成員變量,用this指針指向了。
