C++的private的屬性或方法真的不能訪問嗎? no
我們通常說,C++的private屬性或者方法不能被其他的物件訪問,在很多時候的確是這樣,但不是絕對的,只要你想辦法,總有辦法可以訪問的廢話不多說,直接上程式碼了。
1)訪問private的私有成員:
#include <iostream>
using namespace std;
class Parent
{
public:
virtual void fun()
{
cout<<"Parent::fun()"<<endl;
}
};
class Child:public Parent
{
private:
virtual void fun()
{
cout<<"Child::fun"<<endl;
}
};
int main(int argc, char** argv)
{
Parent* ch = new Child;
ch->fun();//輸出Child::fun
delete ch;
return 0;
}
很奇怪吧?其實嚴格說,C++的禁止外部類訪問private 是指在編譯期,執行期都是在記憶體中的資料,是可以做任何修改的。而C++的多型是在編譯期間,當在編譯期間由於多型的關係,虛擬函式表中(如果不知道什麼是虛擬函式表可以去看看C++物件的記憶體模型或在網上搜索資料)子類Child重寫的了虛擬函式fun(),所以在虛擬函式表的第一個地址就是子類的fun的地址,也就是說用父類物件new一個子類,其父類的物件的指標指向的地址數虛擬函式表的第一個地址,也就是Child的virtual函式fun()的地址。但是在執行期間時,什麼private、public其實都是都不起作用,都是記憶體中的資料,所以結果就輸出Child::fun也就不足為奇了。所以啊,我們不得不說C++博大精深!
1)訪問private的私有屬性:
#include <iostream>
using namespace std;
class Parent
{
private:
int number;
char temp;
char tmp[50];
void show()
{
cout<<"private:"<<endl<<temp<<endl<<tmp<<endl<<number<<endl;
}
public:
Parent( int c, char a, char b[50]):temp(a), number(c)
{
strcpy(this->tmp, b);
}
};
int main(int argc, char** argv)
{
Parent pa( 5,'H', "hello world!");
//pa.show(); //不能訪問私有的
char* p = (char*)&pa;
cout<<(int)*p<<endl; //訪問私有的,輸出5
cout<<*(p+4)<<endl; //訪問私有的,輸出H
cout<<(p+5)<<endl; //訪問私有的,輸出hello world
return 0;
}
其實在C/C++的世界裡面,指標可以說是無所不能的,非常強大,上面的就一個例子,通過強制型別轉換和指標偏移就可以訪問private的屬性。
以上程式碼在VS2008上驗證通過,其觀點僅僅代表個人理解,有不當之處還請多多指教。