我们可以在派生 class 中访问基 class 的受保护成员函数吗?

Can we access protected member functions of base class in derived class?

根据我的研究,Derived class 可以访问基 class 的受保护成员。在派生 class 中,基 class 的受保护成员在派生 class 中作为 public 工作。 但是当我实现这个时,我得到一个错误

我的代码:


#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) {
            ^~~~~~~~~


请有人帮助我理解访问修饰符

In derived class, protected member of base class works as public in derived class.

事实并非如此。要么是您的来源有误,要么是此引述被断章取义。

publicly-inherited 基 class 的受保护成员默认情况下在派生 class 中仍然受到保护,也就是说,派生 class 成员函数可以访问它们,但无法从 class.

外部访问它们

您可以确认并了解更多详细信息here,特别是在“受保护的成员访问”段落中。

是的,派生的 class 可以访问受保护的成员,无论这些成员是数据还是函数。但是在您的代码中,是 main 试图访问 setWidthsetHeight,而不是 Rectangle。这是无效的,就像使用 main 中的 widthheight 一样。

派生 class 使用受保护成员函数的示例:

class Rectangle: public Shape {
public:
    int getArea() const { 
        return (width * height); 
    }
    void setDimensions(int w, int h) {
        setWidth(w);
        setHeight(h);
    }
};

或者如果你真的想让 Rectangle 让其他人使用这些功能,你可以使用 Rectangle 必须使他们成为 Rectanglepublic 成员的访问权限的 protected

class Rectangle: public Shape {
public:
    using Shape::setWidth;
    using Shape::setHeight;

    int getArea() const { 
        return (width * height); 
    }
};