[英]Don't understand private/protected variables. My implementation didn't do what I expected
我正在嘗試了解繼承,以及私有,受保護和公共變量的工作方式。
我的理解是,一個類的私有變量只能由該類的成員讀取,而受保護的變量只能由該類的成員以及派生類讀取。
我正在實現一些代碼,以確保我正確理解了這一點,而且我似乎能夠訪問我沒想到能夠訪問的變量。
我有一個類Polygon和一個派生類Triangle。 我在這些類的公共區域編寫了一組read()函數來讀取其變量。 這些函數被重載,因此不帶任何參數的read()將返回調用對象的變量,或者,read(&Poly)可以將另一個多邊形作為參數並返回另一個多邊形的變量。
#include <iostream>
using namespace std;
class Polygon;
class Triangle;
class Polygon {
private:
int privatePoly = 1;
protected:
int protectedPoly = 10;
public:
int publicPoly = 100;
// Setters
void setPrivate (int x) { privatePoly = x; }
void setProtected (int x) { protectedPoly = x; }
// Read
int readPrivate (const Polygon& inPoly) { return inPoly.privatePoly; }
int readProtected (const Polygon& inPoly) { return inPoly.protectedPoly; }
int readPublic (const Polygon& inPoly) { return inPoly.publicPoly; }
};
class Triangle : public Polygon {
private:
int privateTriangle = 3;
protected:
int protectedTriangle = privateTriangle*10;
public:
int publicTriangle = privateTriangle*100;
// Read Triangle variables
int readPrivate_Tri () { return privateTriangle; }
int readProtected_Tri () { return protectedTriangle; }
int readPublic_Tri () { return publicTriangle; }
int readPrivate_Tri (const Triangle& inTri) { return inTri.privateTriangle; }
int readProtected_Tri (const Triangle& inTri) { return inTri.protectedTriangle; }
int readPublic_Tri (const Triangle& inTri) { return inTri.publicTriangle; }
};
我實例化了每種類型的一個對象,即多邊形P1和三角形T1,並嘗試從派生類T1讀取P1的私有變量,並期望這樣做會失敗,因為私有變量不能被派生類讀取。 沒有。
int main(int argc, const char * argv[]) {
Polygon P1;
Triangle T1;
// To make sure T1's polygon variables are different from P1's.
T1.setPrivate(2);
T1.setProtected(20);
// T1 reading P1
cout << "T1.readPrivate(P1): " << T1.readPrivate(P1) << endl;
cout << "T1.readProtected(P1): " << T1.readProtected(P1) << endl;
cout << "T1.readPublic(P1): " << T1.readPublic(P1) << endl << endl;
return 0;
}
這產生
T1.readPrivate(P1):1
T1.readProtected(P1):10
T1.readPublic(P1):100
我認為這可能與以下事實有關:讀取函數最初是在父Polygon類中聲明的(並且私有/受保護的說明符引用了聲明函數的位置,而不是調用對象是誰),因此我給了Triangle類自己的readPolygon(&Polygon)變量副本。 在Triangle類的定義中添加了以下內容:
// Read Polygon variables with separate function unique to Triangle class
int readProtected_P_from_T (const Polygon& inPoly) { return inPoly.protectedPoly; }
int readPublic_P_from_T (const Polygon& inPoly) { return inPoly.publicPoly; }
在哪里添加了readPublic_P_from_T()函數以檢查函數格式。
這不會編譯,並顯示錯誤:“'protectedPoly'是'Polygon'的受保護成員”
我希望它能起作用,因為我認為派生類可以看到受保護的變量。
當從派生類中調用時,我希望第一個readPrivate函數不起作用。
有人可以解釋一下這些訪問說明符如何工作嗎?
類中的任何函數都可以訪問其私有變量。 它也可以從繼承的類中訪問受保護的變量和公共變量。
如果函數本身是公共的,則任何人都可以調用它。
通常,私有變量通過其成員函數用於類的內部需求,而不是面向公眾的。 但是,公共成員函數可以使用它們來執行特定操作。
在您的情況下,所有成員函數都是公共的。 因此,您可以調用它們來訪問類中的任何內部數據。
如果要失敗,請嘗試不使用該功能直接訪問成員數據。 例如
class A {
int a = 0;
public:
int b = 1;
int getA() {
return a;
}
};
A c1;
cout << c1.a << c1.b;
編譯器將在成員訪問上失敗,因為a
是私有的。
另一方面,如果使用getA()
函數,它將起作用,因為該函數本身可以訪問私有成員:
cout << c1.getA() << c1.b;
我的理解是,一個類的私有變量只能由該類的成員讀取,而受保護的變量只能由該類的成員以及派生類讀取。
這種理解是正確的。
我實例化了每種類型的一個對象,即多邊形P1和三角形T1,並嘗試從派生類T1讀取P1的私有變量,並期望這樣做會失敗,因為私有變量不能被派生類讀取。 沒有。
readPrivate()
是Polygon
的成員,因此讀取Polygon
的內部結構沒有問題。
(公共)繼承也使Triangle
也具有這些功能,但是由於它們實際上處於Polygon
級別,因此沒有問題。
這不會編譯,並顯示錯誤:“'protectedPoly'是'Polygon'的受保護成員”
您正在遇到這種情況 。 該鏈接比我能更好地解釋該問題及其答案,所以我將其保留在那里。
有人可以解釋一下這些訪問說明符如何工作嗎?
除了一些小的差異外,您似乎已經對該主題有了很好的掌握。 但是,如果您想了解有關繼承的更多信息,這里是一個有用的資源 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.