我正在尝试一个小例子来实践继承和多态性的概念。这是我的代码的简化版本:
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'
据我了解,在公共继承中,基类的受保护成员成为派生类的受保护成员,应该能够像公共成员一样被访问。那不对吗?另外,如果长度和宽度是基类的私有成员,那么该如何修改代码?
据我了解,在公共继承中,基类的受保护成员成为派生类的受保护成员,应能够像公共成员一样被访问。那不对吗?
这基本上是对的。在派生类中可以访问基类的公共成员和受保护成员(public
继承在这里无关紧要-仅影响外部观察者的访问)。但是,(具有任何访问权限的)类成员只能在自己的类中初始化。在这种情况下,只能Shape
初始化,length
并且width
-没关系,protected
如果是public
或,也是如此private
。
您必须添加一个构造函数来执行此操作,您的Rectangle
构造函数可以简单地委派给该构造函数。这无论作品的访问控制length
和width
(只要Shape
构造函数public
或protected
):
struct Shape {
Shape(int l, int w) : length(l), width(w) { }
};
struct Rectangle {
Rectangle(int l, int w) : Shape(l, w) { }
};
或者,为了完整起见,您可以只分配它们,但绝对希望对其进行Shape
初始化。此外,这仅在所涉及的成员为public
或时才有效protected
:
Rectangle(int l, int w) {
length = l;
width = w;
}
请注意,您setWidth()
和setLength()
功能都很好-你做访问这些保护成员Rectangle
的成员函数。只是不用于初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句