Я пробую небольшой пример для практики концепций наследования и полиморфизма. Вот упрощенная версия моего кода:C++ - Доступ к защищенным/закрытым членам базового класса
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'
В моем понимании, в общественном наследовании, защищенные члены базового класса становятся защищенными членами производного класса и должно иметь возможность обращаться как по электронному публичных членов. Это неправильно? Кроме того, как тогда код должен быть изменен, если длина и ширина были частными членами базового класса?
это поможет, если вы снизили этом [mcve], так ошибка легче увидеть. Большая часть кода, который вы опубликовали, не имеет значения. – juanchopanza
@Q_A Чтобы дать вам представление о том, что мы подразумеваем под минимальным, я уменьшил ваш код до двух десятков строк, которые воспроизводят ту же ошибку. Надеюсь, ты не против. Обратите внимание, что многие из функций не имеют отношения к проблеме, с которой вы столкнулись, и вам не нужно создавать массив 'Shape's, чтобы воспроизвести его и т. Д. – Barry
Спасибо, я буду помнить это –