[英]Access specifiers and virtual functions
當在C ++指定的3個不同訪問說明符(公共,私有,受保護)下聲明虛函數時,可訪問性的規則是什么?每個的重要性是什么? 任何解釋這個概念的簡單代碼示例都非常有用。
訪問說明符的應用方式與在名稱查找期間對任何其他名稱的應用方式相同。 功能是虛擬的這一事實根本不重要。
有時會出現與虛函數有關的常見錯誤。
如果名稱查找將可行函數確定為虛函數,則在用於命名函數的對象表達式的靜態類型的范圍內檢查虛函數的訪問說明符。 在運行時,可以使用完全不同的訪問說明符在派生類中定義要調用的實際函數。 這是因為“訪問說明符”是編譯時的現象。
// 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
當在基類中使用虛函數時,它們就像常規函數(純虛函數的例外)。
總結一下我的頭腦:
任何人都可以訪問公共功能。 私有函數只能是類訪問,其朋友受保護的函數就像私有函數一樣,只有派生類才能訪問它們。
Public是接口,private / protected函數是內部。 另請注意,所有局部變量(根據封裝)都應該受到保護/私有。
現在,當涉及派生類時,您派生出一個這樣的類:
class A : [public | protected | private] B
{
};
現在,B的公共/私有/受保護限定符規定了從基類繼承的限制最少的安全級別。 這不是方法和局部變量的“過濾器”,因為某些方法和局部變量沒有被繼承,只是如果它們受到較少限制(更公開),它只會將其安全級別更改為指定的安全級別。
所以class A : public B
將保留繼承的基礎成員,而class A : private B
將把它們全部更改為私有成員。
希望這對你有意義並回答你的問題。 如果沒有,請告訴我!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.