![](/img/trans.png)
[英]What is the difference between public, private, and protected inheritance in C++?
[英]What is the difference between private and protected members of C++ classes?
C++ 類中的private
成員和protected
成員有什么區別?
我從最佳實踐約定中了解到,在 class 之外未調用的變量和函數應該設為private
- 但看看我的 MFC 項目,MFC 似乎更傾向於protected
。
有什么區別,我應該使用哪個?
私有成員只能在定義它們的類中訪問。
受保護成員可在定義它們的類中以及從該類繼承的類中訪問。
編輯:它們的類的朋友也可以訪問它們,在受保護成員的情況下,它們的派生類的朋友也可以訪問它們。
編輯 2:在您的問題的上下文中使用任何有意義的內容。 您應該盡可能將成員設為私有,以減少耦合並保護基類的實現,但如果不可能,則使用受保護的成員。 查看C++ FAQ以更好地理解該問題。 這個關於受保護變量的問題也可能有所幫助。
A 類的公共成員可供所有人訪問。
類 A 的受保護成員不能在 A 的代碼之外訪問,但可以從從 A 派生的任何類的代碼中訪問。
類 A 的私有成員不能在 A 的代碼之外訪問,也不能從從 A 派生的任何類的代碼中訪問。
因此,最終,在受保護或私有之間進行選擇是在回答以下問題:您願意對派生類的程序員信任多少?
默認情況下,假定派生類不受信任,並將您的成員設為私有。 如果你有一個很好的理由讓母類的內部結構可以自由訪問它的派生類,那么你可以讓它們受到保護。
可以從派生類訪問受保護的成員。 私人的不行。
class Base {
private:
int MyPrivateInt;
protected:
int MyProtectedInt;
public:
int MyPublicInt;
};
class Derived : Base
{
public:
int foo1() { return MyPrivateInt;} // Won't compile!
int foo2() { return MyProtectedInt;} // OK
int foo3() { return MyPublicInt;} // OK
};
class Unrelated
{
private:
Base B;
public:
int foo1() { return B.MyPrivateInt;} // Won't compile!
int foo2() { return B.MyProtectedInt;} // Won't compile
int foo3() { return B.MyPublicInt;} // OK
};
在“最佳實踐”方面,這取決於。 如果有人可能想要從您現有的類派生一個新類並需要訪問內部成員的可能性很小,請將它們設為 Protected,而不是 Private。 如果它們是私有的,您的類可能會變得難以輕松繼承。
MFC 之所以偏愛受保護,是因為它是一個框架。 您可能希望對 MFC 類進行子類化,在這種情況下,需要一個受保護的接口來訪問對類的一般使用不可見的方法。
這完全取決於您想要做什么,以及您希望派生類能夠看到什么。
class A
{
private:
int _privInt = 0;
int privFunc(){return 0;}
virtual int privVirtFunc(){return 0;}
protected:
int _protInt = 0;
int protFunc(){return 0;}
public:
int _publInt = 0;
int publFunc()
{
return privVirtFunc();
}
};
class B : public A
{
private:
virtual int privVirtFunc(){return 1;}
public:
void func()
{
_privInt = 1; // wont work
_protInt = 1; // will work
_publInt = 1; // will work
privFunc(); // wont work
privVirtFunc(); // will work, simply calls the derived version.
protFunc(); // will work
publFunc(); // will return 1 since it's overridden in this class
}
}
標記為protected
屬性和方法——與私有的不同——在子類中仍然可見。
除非您不想在可能的子類中使用或提供覆蓋該方法的可能性,否則我會將它們設為private
。
當然看看受保護的成員變量問題。 建議使用 private 作為默認值(就像 C++ class
ses 所做的那樣)以減少耦合。 受保護的成員變量總是一個壞主意,受保護的成員函數可用於例如模板方法模式。
受保護的成員只能由類的后代以及同一模塊中的代碼訪問。 私有成員只能由它們聲明的類以及同一模塊中的代碼訪問。
當然,友元函數會將其拋之腦后,但哦,好吧。
私有成員只能從類內部訪問,受保護成員可以在類和派生類中訪問。 這是面向對象語言中繼承的一個特性。
您可以在 C++ 中擁有私有、受保護和公共繼承,這將決定哪些派生類可以在繼承層次結構中訪問。 例如,C# 只有公共繼承。
private = 只能由母艦(基類)訪問(即只有我的父母可以進入我父母的卧室)
protected = 母艦(基類)和她的女兒可以訪問(即只有我的父母可以進入我父母的卧室,但允許兒子/女兒進入父母的卧室)
public = 母艦(基類)、女兒和其他所有人都可以訪問(即只有我的父母可以進入我父母的卧室,但這是一個家庭聚會 - mi casa su casa)
由於在派生類中不需要公共成員函數來獲取和更新受保護的成員,這提高了代碼的效率並減少了我們需要編寫的代碼量。 但是,派生類的程序員應該知道他在做什么。
成員數據首選private
。 C++ 類中的成員默認是private
的。
public
是成員函數的首選,盡管這是一個意見問題。 至少某些方法必須是可訪問的。 public
對所有人開放。 這是最靈活的選擇,也是最不安全的。 任何人都可以使用它們,任何人都可以濫用它們。
private
根本無法訪問。 沒有人可以在課堂外使用它們,也沒有人可以濫用它們。 甚至在派生類中也不行。
protected
是一種折衷方案,因為它可以在派生類中使用。 當你從一個類派生時,你對基類有很好的理解,注意不要誤用這些成員。
MFC 是 Windows API 的 C++ 包裝器,它更喜歡public
和protected
。 Visual Studio 向導生成的類包含protected
、 public
和private
成員的丑陋組合。 但是 MFC 類本身有一些邏輯。
SetWindowText
等成員是public
因為您經常需要訪問這些成員。
OnLButtonDown
等成員處理窗口收到的通知。 它們不應被訪問,因此它們受到protected
。 您仍然可以在派生類中訪問它們以覆蓋這些函數。
一些成員必須做線程和消息循環,它們不應該被訪問或覆蓋,所以它們被聲明為private
在 C++ 結構中,成員默認是public
的。 結構通常僅用於數據,而不是方法,因此public
聲明被認為是安全的。
Private :可通過類成員函數和友元函數或友元類訪問。 對於 C++ 類,這是默認訪問說明符。
受保護:可由類成員函數、友元函數或友元類和派生類訪問。
有關更多詳細信息,請參閱此鏈接。
Private :它是一個訪問說明符。 默認情況下,c++/java 中的實例(成員)變量或類的方法是私有的。 在繼承期間,代碼和數據總是被繼承,但不能在類外訪問。 我們可以將我們的數據成員聲明為私有的,這樣就沒有人可以直接更改我們的成員變量,並且我們可以提供公共的 getter 和 setter 來更改我們的私有成員。 而這個概念總是應用在業務規則中。
Protected :它也是一個訪問說明符。 在 C++ 中,受保護的成員可以在類內和繼承的類中訪問,但不能在類外訪問。 在 Java 中,受保護的成員可以在類內、繼承的類以及同一包中的所有類中訪問。
私有成員只能在它聲明的同一類中訪問,而受保護成員可以在聲明它的類中訪問,以及由它繼承的類。
受保護的非靜態基類成員可以由從該基類派生的任何類的成員和朋友使用以下方法之一訪問:
protected
關鍵字指定對成員列表中 class 成員的訪問,直到下一個訪問說明符(public
或private
)或 class 定義的末尾。 聲明為protected
的Class members
只能由以下人員使用:
- 最初聲明這些成員的 class 的成員函數。
- 最初聲明這些成員的 class 的朋友。
- 從最初聲明這些成員的 class 派生的具有公共或受保護訪問權限的類。
- 直接私有派生類,它們也對受保護成員具有私有訪問權限。
在基礎 class 的名稱之前,
protected
關鍵字指定基礎 class 的公共和受保護成員是其派生類的受保護成員。受保護的成員不像
private
成員那樣私有,私有成員只能被聲明它們的 class 的成員訪問,但它們不像公共成員那樣公開,在任何 function 中都可以訪問。任何
friend
或派生 class 的成員 function 都可以訪問也聲明為static
的受保護成員。 Protected members that are not declared as static are accessible to friends and member functions in a derived class only through a pointer to, reference to, or object of the derived class.
C++ 類中的私有成員和受保護成員有什么區別?
其他答案已經說明:
有什么區別,我應該使用哪個?
C++ 核心指南建議數據應該始終是私有的。 我認為這是一個很好的建議,因為當您擁有可以訪問受保護數據的派生類時,它會產生“數據意大利面條”。 保護功能更有意義,但這取決於用例。
對於功能,您可以選擇。 對於數據,您應該將其設為私有並在需要時提供受保護的訪問器函數。 這可以更好地控制 class 數據。
private 和 protected 訪問修飾符是一回事,只有基類的受保護成員可以在子(派生)類中的基類范圍之外訪問。 它也同樣適用於繼承。 但是使用 private 修飾符,基類的成員只能在基類的范圍或代碼中訪問,並且只能在其友元函數中訪問''''
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.