c++ - 访问孙类中基类的 protected 成员

标签 c++ c++11 inheritance c++14 access-specifier

我有一个包含声明为 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

最佳答案

您的问题是您是从基类私有(private)继承的,因此基类的公共(public)和 protected 成员与派生类的私有(private)成员获得相同的访问控制。虽然可能,但私有(private)继承是一种非常特殊的工具,很少使用。在绝大多数情况下,您需要公共(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);
};

通过这种方式, protected 成员将对所有后代(不仅仅是直系子代)正常可见。


如果出于某种原因,您想坚持使用私有(private)继承,则必须将私有(private)继承的 protected 成员“提升”回 protected :

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

关于c++ - 访问孙类中基类的 protected 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233729/

相关文章:

c++ - Visual C++ 2010 Express 中的默认 C++0x 模式是什么?

c++ - 如何保持存储在作为参数传递的指针中的地址在所有函数调用中保持一致

c++ - 使用 Allegro/SDL 与 OpenGL/DirectX 制作游戏会遇到哪些限制?

c++ - 我如何向只用 Fortran 77 编码的人解释面向对象的编程?

c++ - boost::signals2 对于简单的应用程序是否矫枉过正?

c++ - 带有 const 引用的 std::remove_const

java - 正确的 java.util.ResourceBundle 组织

c++ - 在子类中实现继承类的方法(param=指向父的指针)(param=指向子的指针)

javascript - AngularJS Controller 继承和执行顺序

java - 我可以从 native c++ 检测 Java 版本吗