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

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 
Теги:
inheritance
protected
access-specifier

1 ответ

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& ? Это даже не допускается при передаче по значению.
  • 0
    При доступе к _oActivity.duration вы _oActivity.duration доступ к классу CourseActivity извне, что означает, что к защищенным или закрытым членам нельзя получить доступ. Неважно, где в коде это находится, это может быть даже внутри одного класса.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню