在孙子类中访问基类的受保护成员

3

我有一个包含protected声明属性的父类。我知道protected成员可以在子类中访问。但是如何在孙子类中访问相同的内容呢?

例如,如何在TooSmall类中访问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;
}

在子类中有办法将父类属性设置为public吗?


1
修改为 class SmallBox: protected Boxclass TooSmall: protected SmallBox - Eljay
1个回答

9
你的问题在于你私有地继承了基类,所以基类的公有和保护成员将获得派生类私有成员相同的访问控制。尽管可以这样做,但私有继承是一种非常特定的工具,很少使用。在绝大多数情况下,我们希望使用公有继承:
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);
};

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


如果出于某种原因您想要坚持使用私有继承,则需要将私有继承的受保护成员“提升”回受保护状态:

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);
};

1
那样做可以!但是否可以考虑私有继承来完成? - Abhinav Kinagi
4
回答已更新,请确认私有继承是否是您想要的。公共继承代表了通常在讨论继承时所期望的标准is-a关系。而另一方面,保护/私有继承代表按照一定方式来实现,从某些角度看,它更接近于组合而不是真正的继承。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接