我正在嘗試一個小例子來實踐繼承和多態的概念。這裏是我的代碼的簡化版本:C++ - 訪問基類的受保護/私有成員
class Shape {
protected:
int length;
int width;
public:
virtual void setLength(int l) = 0;
virtual void setWidth(int w) = 0;
};
class Rectangle : public Shape {
public:
Rectangle(int l, int w)
: length(l), width(w)
{ }
void setWidth(int w) { width = w; }
void setLength(int l) { length = l; }
};
int main() {
Rectangle r(0,0);
}
我試圖運行上述程序。然而,當我編譯rectangle.cc,我收到以下錯誤
g++ -c rectangle.cc
rectangle.cc: In constructor 'Rectangle::Rectangle(int, int)':
rectangle.cc:13:5: error: class 'Rectangle' does not have any field named 'length'
rectangle.cc:13:16: error: class 'Rectangle' does not have any field named 'width'
據我瞭解,在公有繼承,基類的保護成員成爲派生類的保護成員,應該能夠到E像訪問公衆成員。那是不正確的?另外,如果長度和寬度都是基類的私有成員,那麼代碼將如何修改呢?
如果減少這一個[MCVE]所以這將有助於錯誤更容易看到。你發佈的大部分代碼都是不相關的。 – juanchopanza
@Q_A爲了讓您對我們的意思最小化有所認識,我將您的代碼縮減爲只有二十幾行重現相同錯誤的代碼。我希望你不介意。請注意,許多函數與您遇到的問題無關,也不需要創建一個「Shape」數組來重現它,等等。 – Barry
謝謝,我會記住這一點 –