【发布时间】:2016-07-15 02:37:56
【问题描述】:
我正在尝试一个小例子来练习继承和多态的概念。这是我的代码的简化版本:
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'
据我了解,在公共继承中,基类的受保护成员成为派生类的受保护成员,并且应该能够像公共成员一样访问。这是不正确的吗?另外,如果 length 和 width 是基类的私有成员,那么需要如何修改代码?
【问题讨论】:
-
如果您将其减少为 minimal reproducible example 会有所帮助,这样更容易看到错误。您发布的大部分代码都是无关紧要的。
-
@Q_A 为了让您了解我们所说的最小化是什么意思,我将您的代码减少到仅能重现相同错误的两打代码。我希望你不要介意。请注意,许多功能与您遇到的问题无关,也不需要创建
Shapes 的数组来重现它等。 -
谢谢,我会记住的
标签: c++ inheritance polymorphism private protected