#c #inheritance #base #derived
#c #наследование #основание #производный
Вопрос:
Поскольку я изучил, что производный класс может получить доступ к защищенному члену базового класса. В производном классе защищенный член базового класса работает как общедоступный в производном классе. Но когда я это реализую, я получаю сообщение об ошибке
Мой код :
#include <iostream>
using namespace std;
class Shape {
protected :
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
Ошибка :
In function ‘int main()’:
32:19: error: ‘void Shape::setWidth(int)’ is protected within this context
Rect.setWidth(5);
^
:9:12: note: declared protected here
void setWidth(int w) {
^~~~~~~~
:33:20: error: ‘void Shape::setHeight(int)’ is protected within this context
Rect.setHeight(7);
^
:12:12: note: declared protected here
void setHeight(int h) {
^~~~~~~~~
Пожалуйста, кто-нибудь, помогите мне разобраться в модификаторах доступа
Комментарии:
1.
Rectangle::setWidth()
нетpublic
, но вы пытаетесь получить к нему доступ, как будто это так.
Ответ №1:
Да, производный класс может получить доступ к защищенным членам, независимо от того, являются ли эти члены данными или функциями. Но в вашем коде это main
то, что пытается получить доступ, setWidth
а setHeight
нет Rectangle
. Это недопустимо точно так же, как использование width
и height
из main
было бы.
Пример производного класса, использующего защищенные функции-члены:
class Rectangle: public Shape {
public:
int getArea() const {
return (width * height);
}
void setDimensions(int w, int h) {
setWidth(w);
setHeight(h);
}
};
Или, если вы действительно хотите Rectangle
разрешить кому-либо еще использовать функции, вы можете использовать access Rectangle
, чтобы сделать их public
членами Rectangle
вместо protected
:
class Rectangle: public Shape {
public:
using Shape::setWidth;
using Shape::setHeight;
int getArea() const {
return (width * height);
}
};
Ответ №2:
В производном классе защищенный член базового класса работает как общедоступный в производном классе.
Это не так. Либо ваш источник неверен, либо эта цитата вырвана из соответствующего контекста.
Защищенные члены общедоступного базового класса по умолчанию по-прежнему защищены в производном классе, что означает, что функции-члены производного класса могут обращаться к ним, но они недоступны извне класса.
Вы можете подтвердить это и узнать больше деталей здесь, в частности, в параграфе «Защищенный доступ к элементам».