2013-10-14 2 views
0

Ошибки:не удается получить доступ к защищенному члену класса в производном классе

d_start является защищенным членом CourseActivity
duration является защищенным членом CourseActivity
location является защищенным членом 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

Возможный дубликат [access protected inherited member с указателем на базовый класс] (http://stackoverflow.com/questions/15969658/access-protected-inherited-member-with-pointer-to-base-class) – dyp

+0

Что вызывает ошибку? Здесь нет кода, который бы это сделал. –

+0

Доступ к защищенным методам родительского объекта можно получить только от объекта, который сходит с этого родителя. Здесь oActivity не является родителем только что созданного объекта, поэтому его защищенные члены не могут быть доступны. – Ashalynd

ответ

1

Вы передаете экземпляр CourseActivity функции Lecture::Lecture. Даже если CourseActivity действительно является базовым классом Lecture, вы не можете получить доступ к защищенным членам класса извне (например, _oActivity.duration), даже если объект, на котором вы работаете, имеет производный тип.

Чтобы избежать ваших конкретных проблем, вы можете создать этот конструктор базового класса

CourseActivity::CourseActivity(const CourseActivity &_oActivity) 

и назвать его

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

в производном классе. В базовом классе вы можете получить доступ к защищенным членам, а не к производному классу, где это запрещено.

+0

«экземпляр, который вы передаете, не обязательно совпадает с текущим базовым классом» Вы ссылаетесь на ссылку 'const CourseActivity &'? Это даже не допускается при передаче по значению. – dyp

+0

Когда вы обращаетесь к '_Activity.duration', вы получаете доступ к классу« CourseActivity »извне, а это означает, что к закрытым или закрытым членам нельзя получить доступ. Не имеет значения, где именно в коде это может быть даже внутри одного класса. – Atle

+0

Код может быть в классе 'CourseActivity'; в этом случае это разрешено. [Живой пример] (http://coliru.stacked-crooked.com/a/05073431636e9459) – dyp

 Смежные вопросы

  • Нет связанных вопросов^_^