1. 程式人生 > >C++的private的屬性或方法真的不能訪問嗎? no

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上驗證通過,其觀點僅僅代表個人理解,有不當之處還請多多指教。