簡體   English   中英

不了解私有/受保護的變量。 我的實現未達到我的預期

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM