无法从派生类访问受保护的成员

时间:2015-10-01 20:06:52

标签: c++ member protected

我有一个类似于此的设置。来自包含受保护成员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不可访问,即使它们在基类中列为受保护的。

2 个答案:

答案 0 :(得分:4)

默认情况下class的推导为private。如果您想要访问protected基础成员,那么您必须进行推导public

class AnimatedSprite : public Sprite

// ...

class Player : public Sprite

(您也可以进行推导protected,但这是一件相当奇特的事情。您也可以进行第一次推导publicprotected并离开第二个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);
}