C++-访问基类的受保护/私有成员
C++ - Accessing protected/private members of a base class
我正在尝试一个小例子来实践继承和多态性的概念。这是我的代码的简化版本:
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
的成员函数中受保护的成员。只是不用于初始化。
否,基类的受保护成员不会成为派生类的受保护的成员。基类的受保护成员可由派生类访问,与私有成员不同,它们在派生类的命名空间中保持受保护(因此同样的事情也适用于派生类的派生类,依此类推)。
但是基类的受保护成员仍然是基类的成员,并且基类的构造函数仍然负责构造它们,而不是派生类的构造函数。
删除部分:长度(l),宽度(w)如果你想在派生类中使用长度和宽度(继承的),你只需取其名称即可使用,例如length。。完成。。。如果u恰好在派生类中具有相同的命名字段"length",那么要使用派生类的"length。。。
继承时。。。public访问说明符声明public from base class在派生类中变成public protected from base class变成protected。。。
使用受保护的。。。public和protected from base class变为protected
- C++:无法访问声明的受保护成员
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 从模板化父类中的派生内部类访问受保护的成员变量
- 在使用受保护和继承时无法访问在类中声明的私有成员
- 同一模板类但模板类型的受保护成员
- 派生类无法访问基类的受保护成员
- 继承期间受保护成员的皮条
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 是否可以基于私有/受保护成员分配类枚举?
- 依赖模板基础的受保护成员
- 将派生类构造函数参数传递给受保护的成员
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 将对象强制转换为派生类以访问父类的受保护成员
- 使从一个基类派生的类能够使用继承的受保护成员
- 无法访问派生类函数内的基类的受保护数据成员
- 派生类如何使用基类的受保护成员