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

Unable to access protected member from derived class

本文关键字:受保护 成员 访问 派生      更新时间:2023-10-16

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

默认class的派生为private。如果您想访问protected基成员,那么您必须派生public:

class AnimatedSprite : public Sprite
// ...
class Player : public Sprite

(您也可以使派生为protected,但这将是一件相当奇特的事情。同样,您也可以将第一个派生设置为publicprotected,而将第二个派生设置为private,但这与类层次结构的预期意图不匹配。在这两种情况下,public继承显然是您要寻找的。

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