我有一个类似于此的设置。来自包含受保护成员x。
的单个基类的多级继承class Sprite {
protected:
float x, y;
}
class AnimatedSprite : Sprite {
public:
void draw(float x, float y);
}
class Player : AnimatedSprite {
public:
void draw(float x, float y);
}
派生类Player中方法绘制的实现就是这样的。
void Player::draw(float x, float y) {
AnimatedSprite::draw(this->x, this->y);
}
然而,编译器抱怨成员x和y不可访问,即使它们在基类中列为受保护的。
答案 0 :(得分:4)
默认情况下class
的推导为private
。如果您想要访问protected
基础成员,那么您必须进行推导public
:
class AnimatedSprite : public Sprite
// ...
class Player : public Sprite
(您也可以进行推导protected
,但这是一件相当奇特的事情。您也可以进行第一次推导public
或protected
并离开第二个private
,但这与类层次结构的假设意图不符。public
继承显然是你在两种情况下都要寻找的。)
答案 1 :(得分:3)
AnimatedSprite
使用私有继承,因此Sprite
的成员成为AnimatedSprite
的私有成员。您可能希望使用受保护的继承:
class AnimatedSprite : protected Sprite {
public:
void draw(float x, float y);
}
class Player : protected AnimatedSprite {
public:
void draw(float x, float y);
}