访问孙 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);
};
我有一个父 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);
};