2015-10-01 8 views
-1

J'ai une configuration quelque chose dans le sens de ceci. Plusieurs niveaux d'héritage d'une seule classe de base contenant un membre protégé x. L'implémentation de la méthode dessiner dans la classe dérivée Player est quelque chose le long de ces lignes.Impossible d'accéder au membre protégé de la classe dérivée

void Player::draw(float x, float y) { 
    AnimatedSprite::draw(this->x, this->y); 
} 

Cependant compilateur se plaint que les membres x et y sont inaccessibles, même si elles sont répertoriées comme protégées dans la classe de base.

+0

Pourquoi utiliser l'héritage privé ? – curiousguy

+2

@curiousguy: Parce qu'il ne connaissait pas le niveau d'héritage par défaut pour les classes, je suppose. –

+0

"_compiler is plainte" alors vous devriez probablement poster le message d'erreur au lieu de le paraphraser – curiousguy

Répondre

4

Dérivation pour un class est private par défaut. Si vous souhaitez accéder aux éléments de base protected, vous devez faire la dérivation public:

class AnimatedSprite : public Sprite 

// ... 

class Player : public Sprite 

(Vous pouvez aussi faire la dérivation protected, mais ce serait une chose plutôt exotique à faire, vous pouvez également faire. la première dérivation public ou protected et laisser le second private, mais qui ne correspondraient pas l'intention supposée de la hiérarchie des classes. héritage public est clairement ce que vous cherchez dans les deux cas.)

+0

"alors vous devez rendre la dérivation publique" Pourquoi? – curiousguy

+0

@curiousguy: Oui, vous pouvez aussi faire la première dérivation 'public' et la seconde' private'. Étant donné les noms de classe et l'intention supposée, cela serait bien sûr aussi exotique que l'héritage «protégé». Je vais toujours l'ajouter à la réponse par souci d'exhaustivité. –

3

AnimatedSprite utilise l'héritage privé, de sorte que les membres de Sprite deviennent des membres privés de AnimatedSprite. Vous pouvez utiliser l'héritage protégé:

class AnimatedSprite : protected Sprite { 
public: 
    void draw(float x, float y); 
} 

class Player : protected AnimatedSprite { 
public: 
    void draw(float x, float y); 
} 
+3

Mieux serait l'héritage public, car je suppose que 'AnimatedSprite' et' Player' ont tous les deux une relation * is-a * avec 'Sprite'. – rlbond

+1

Peut-être que vous êtes l'un de ceux que je cherchais depuis environ 15 ans et que je peux vous expliquer pourquoi diable avons-nous besoin d'un héritage protégé? – SergeyA

+0

Cela l'a réparé! Merci pour l'aide. –