我正在尝试一个小例子来练习继承和多态的概念 . 这是我的代码的简化版本:
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'
据我所知,在公共继承中,基类的受保护成员成为派生类的受保护成员,并且应该能够像公共成员一样进行访问 . 这是不正确的?另外,如果长度和宽度是基类的私有成员,那么如何修改代码呢?
3 回答
不,基类的受保护成员不会成为派生类的受保护成员 . 与派生类不同,派生类可以访问基类的受保护成员,并且它们在派生类的名称空间中保持受保护(因此同样的东西适用于派生类的派生类,依此类推) .
但是基类的受保护成员仍然是基类的成员,并且基类的构造函数仍然负责构造它们,而不是派生类的构造函数 .
这基本上是正确的 . 可以在派生类中访问基类的公共成员和受保护成员(
public
inheritance doesn 't matter here - that only affects outside observers' access) . 但是,类成员(任何访问权限)只能在自己的类中初始化 . 在这种情况下,只有Shape
可以初始化length
和width
- 它不会't matter that they' reprotected
,如果它们是public
或private
则也是如此 .您必须添加一个构造函数来执行此操作,您的
Rectangle
构造函数可以简单地委托给它 . 无论length
和width
的访问控制如何(只要Shape
构造函数是public
或protected
),这都有效:或者,为了完整性,您可以只分配它们,但绝对更喜欢让
Shape
初始化它们 . 此外,这仅适用于有问题的成员是public
或protected
:请注意,
setWidth()
和setLength()
函数没问题 - 您可以访问Rectangle
成员函数中的受保护成员 . 只是不进行初始化 .删除部分:length(l),width(w)如果你想在派生类中使用长度和宽度(继承),你可以只使用它的名称来使用它,例如length ... done ...如果你碰巧在派生类中有相同的命名字段'length',那么使用派生类的'length'使用this-> length ...
继承时... public access说明符声明基类中的public在受基类保护的派生类中变为公共...
当使用protected ... public和受保护的基类变得受保护