2013-10-14 2 views
0

Les erreurs sont les suivantes:Impossible d'accéder membre de classe protégée dans une classe dérivée

d_start est membre protégé de CourseActivity
duration est membre protégé de CourseActivity
location est membre protégé de CourseActivity

class CourseActivity{ 

protected: 
    StartTime* d_start; 
    double duration; 
    std::string location; 

public: 
    CourseActivity() = default; 
    CourseActivity(const StartTime* _start, double _duration, 
        const std::string_location); 
    void reschedule(StartTime* _newStart); 
    void print() const; 

}; 



class Lecture: public CourseActivity{ 
    std::string topic; 
    bool deflt = false; //indicate which constructor was used. 
         //false = 1st. true = 2nd 

public: 
    Lecture(const StartTime* _start, double _duration, 
      const std::string location, const std::string& _topic); 
    Lecture(const CourseActivity& _oActivity, const std::string& topic); 
    void print(); 
}; 

// ERROR 
Lecture::Lecture(const CourseActivity& _oActivity, const std::string& _topic) 
: CourseActivity(_oActivity.d_start,_oActivity.duration,_oActivity.location){ 
    topic = _topic; 
    deflt = true; 
} 
// ERROR 
+0

duplication possible de [accès protégé membre hérité avec pointeur vers la classe de base] (http://stackoverflow.com/questions/15969658/access-protected-inherited-member-with-pointer-to-base-class) – dyp

+0

provoque l'erreur? Il n'y a pas de code ici qui ferait ça. –

+0

Vous pouvez uniquement accéder aux méthodes protégées du parent à partir d'un objet descendant de ce parent. Ici, oActivity n'est pas un parent de l'objet nouvellement créé, par conséquent ses membres protégés ne sont pas accessibles. – Ashalynd

Répondre

1

Vous passez une instance de CourseActivity à la fonction Lecture::Lecture. Même si CourseActivity est en effet la classe de base de Lecture, vous ne pouvez pas accéder aux membres de classe protégés de l'extérieur (comme _oActivity.duration) même si l'objet sur lequel vous travaillez est de type dérivé.

Pour éviter que vos problèmes particuliers, vous pouvez créer ce constructeur dans la classe de base

CourseActivity::CourseActivity(const CourseActivity &_oActivity) 

et l'appeler avec

Lecture::Lecture(const CourseActivity& _oActivity, const std::string& _topic) 
    : CourseActivity(_oActivity) 

dans la classe dérivée. Dans la classe de base, vous pouvez alors accéder aux membres protégés, contrairement à la classe dérivée, où cela n'est pas autorisé.

+0

"l'instance que vous transmettez n'est pas nécessairement la même que la classe de base actuelle" Faites-vous référence à la référence 'const CourseActivity &'? Ce n'est même pas autorisé en passant en valeur. – dyp

+0

Lorsque vous accédez à '_oActivity.duration', vous accédez à la classe' CourseActivity' de l'extérieur, ce qui signifie que vous ne pouvez pas accéder aux membres protégés ou privés. Peu importe où se trouve le code, il pourrait même être dans la même classe. – Atle

+0

Le code peut être dans la classe 'CourseActivity' elle-même; dans ce cas, c'est autorisé. [Exemple en direct] (http://coliru.stacked-crooked.com/a/05073431636e9459) – dyp

Questions connexes