2010-09-24 66 views
1

在C++指定的3個不同的訪問說明符(public,private,protected)下聲明虛函數時,可訪問性的規則是什麼 每個函數的意義是什麼?任何簡單的代碼示例來解釋這個概念將非常有用。訪問說明符和虛函數

+0

訪問關於她的關於關於 – 2010-09-24 13:34:02

回答

8

訪問說明符的應用方式與在名稱查找過程中對其他任何名稱的應用方式相同。功能是虛擬的這一事實根本不重要。

在虛擬功能方面有時會發生常見錯誤。

如果名稱查找將可行函數確定爲虛函數,則在用於命名該函數的對象表達式的靜態類型的範圍內檢查虛函數的訪問說明符。在運行時,要調用的實際函數可以使用完全不同的訪問說明符在派生類中定義。這是因爲'訪問說明符'是編譯時間表單子。

// Brain compiled code ahead 
struct A{ 
    virtual void f() {} 
private: 
    virtual void g() {} 
protected: 
    virtual void h() {} 
}; 

struct B : A{ 
private: 
    virtual void f() {}   // Allowed, but not a good habit I guess! 
}; 

B b; 
A &ra = b; 

ra.f(); // name lookup of 'f' is done in 'A' and found to be public. Compilation 
      // succeeds and the call is dynamically bound 
      // At run time the actual function to be called is 'B::f' which could be private, protected etc but that does not matter 
+0

謝謝!很好的解釋。 – 2010-09-24 10:48:36

+0

「大腦編譯代碼」大聲笑,這是@ sbi的模式。也許我應該從我的代碼開始介紹這種介紹。經常發生我的代碼腦死亡 – 2010-09-25 12:31:29

+0

@Johannes Schaub - litb::), – Chubsdad 2010-09-25 12:59:37

0

在基類中使用虛函數就像普通函數(純虛函數除外)一樣。

從我的頭頂總結:

公共職能的任何人都可以訪問。 私有函數只能訪問類和其朋友 受保護的函數就像私有函數一樣,只有它們可以被派生類訪問。

public是接口,而private/protected函數是內部的。 還要注意,所有的局部變量(根據封裝)應該被保護/私有。

現在,當它涉及到派生類,你派生類是這樣的:

class A : [public | protected | private] B 
{ 
}; 

現在,公共/私營/保護盈B的資格規定限制最少的安全級別從基繼承類。對於方法和局部變量來說,這不是一個「過濾器」,因爲有些不是繼承的,只是將它們的安全級別更改爲指定的安全級別,如果它們的限制較少(更公開)。

因此class A : public B將離開繼承的基本成員, class A : private B會將它們全部更改爲私有成員。

希望這對你有意義並回答你的問題。如果沒有,告訴我!