Можем ли мы получить доступ к защищенным функциям-членам базового класса в производном классе?

#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:

В производном классе защищенный член базового класса работает как общедоступный в производном классе.

Это не так. Либо ваш источник неверен, либо эта цитата вырвана из соответствующего контекста.

Защищенные члены общедоступного базового класса по умолчанию по-прежнему защищены в производном классе, что означает, что функции-члены производного класса могут обращаться к ним, но они недоступны извне класса.

Вы можете подтвердить это и узнать больше деталей здесь, в частности, в параграфе «Защищенный доступ к элементам».