访问孙 class 中基 class 的受保护成员

Access protected members of base class in grandchild class

我有一个父 class 包含声明为 protected 的属性。我知道 protected 成员可以在子 class 中访问。但是如何在孙子 class.

中访问相同的内容

例如,如何在 TooSmall class 中访问 width

考虑这个代码示例:

#include <iostream>
using namespace std;

class Box {
   protected:
      double width;
};

class SmallBox:Box {
   protected:
      double height;
};

class TooSmall:SmallBox {
    public:
        void setSmallWidth( double wid );
        void setHeight(double hei);
        double getSmallWidth( void );
        double getHeight(void);
};


double TooSmall::getSmallWidth(void) {
   return width ;
}

void TooSmall::setSmallWidth( double wid ) {
   width = wid;
}

void TooSmall::setHeight( double hei ) {
   height = hei;
}

double TooSmall::getHeight(void) {
   return height;
}

// Main function for the program
int main() {
   TooSmall box;

   box.setSmallWidth(5.0);
   box.setHeight(4.0);
   cout << "Width of box : "<< box.getSmallWidth() << endl;
   cout << "Height of box : "<< box.getHeight() << endl;

   return 0;
}

有没有办法在子 class 中创建父 class 属性 public

你的问题是你是从你的基 class 私有继承的,所以 public 和基 class 的受保护成员获得与私有成员相同的访问控制派生 class。虽然可能,但私有继承是一种非常特殊的工具,很少使用。在绝大多数情况下,你想要 public 继承:

class SmallBox: public Box {
   protected:
      double height;
};

class TooSmall: public SmallBox {
    public:
        void setSmallWidth( double wid );
        void setHeight(double hei);
        double getSmallWidth( void );
        double getHeight(void);
};

这样一来,受保护的成员将对所有后代(不仅仅是直系子代)正常可见。


如果出于某种原因,您想坚持使用私有继承,则必须 "promote" 将私有继承的受保护成员恢复为受保护:

class SmallBox:Box {
   protected:
      double height;
      using Box::width; // make it protected again
};

class TooSmall:SmallBox {
    public:
        void setSmallWidth( double wid );
        void setHeight(double hei);
        double getSmallWidth( void );
        double getHeight(void);
};