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

Грешките са:

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 

person Hazem Beshara    schedule 14.10.2013    source източник
comment
възможен дубликат на достъп защитен наследен член с указател към базов клас   -  person dyp    schedule 14.10.2013
comment
Какво причинява грешката? Тук няма код, който да направи това.   -  person Alec Teal    schedule 14.10.2013
comment
Можете да получите достъп до защитените методи на родителя само от обект, който произлиза от този родител. Тук oActivity не е родител на новосъздадения обект, следователно неговите защитени членове не могат да бъдат достъпни.   -  person Ashalynd    schedule 14.10.2013
comment
Или може би е дубликат на този въпрос. Както и да е, това е дубликат.   -  person dyp    schedule 14.10.2013
comment
Благодаря, това е дубликат. извинявам се   -  person Hazem Beshara    schedule 14.10.2013
comment
@HazemBeshara Понякога е трудно да се намерят дубликати. Няма проблем. Все още търсех по-добро съвпадение, може би този.   -  person dyp    schedule 14.10.2013
comment
Има ли друг начин да заобиколите това, освен да използвате приятелски клас или да промените видимостта на тези атрибути на публични?   -  person Hazem Beshara    schedule 14.10.2013
comment
@HazemBeshara Може би делегиране на copy-ctor на CourseActivity? : CourseActivity(_oActivity)   -  person dyp    schedule 14.10.2013


Отговори (1)


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

За да избегнете конкретните си проблеми, можете да създадете този конструктор в базовия клас

CourseActivity::CourseActivity(const CourseActivity &_oActivity)

и го наречете с

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

в производния клас. След това в базовия клас можете да получите достъп до защитените членове, за разлика от производния клас, където това не е разрешено.

person Atle    schedule 14.10.2013
comment
екземплярът, който предавате, не е непременно същият като текущия базов клас. Имате предвид препратката const CourseActivity&? Дори не е позволено при преминаване по стойност. - person dyp; 14.10.2013
comment
Когато осъществявате достъп до _oActivity.duration, вие осъществявате достъп до класа CourseActivity отвън, което означава, че няма достъп до защитени или частни членове. Няма значение къде в кода е това, може дори да е в същия клас. - person Atle; 14.10.2013
comment
Кодът може да е в самия клас CourseActivity; в такъв случай е разрешено. Пример на живо - person dyp; 14.10.2013
comment
Вярно. Не можете ли (= питащ) просто да прехвърлите целия _oActivity в конструктор на CourseActivity? - person Atle; 14.10.2013
comment
Да, аз също предложих това в коментар към ОП. След като помислих известно време за това, дори бих препоръчал да го направите. Базовият клас е отговорен за копието, което не трябва да е работа на производния клас. - person dyp; 14.10.2013
comment
Добавих и това към отговора си. - person Atle; 14.10.2013
comment
освен ако това не е направено в клас от същия тип и дори ако обектът, с който работите, е от производен тип. И не е необходимо да създавате copy-ctor, той се създава автоматично в този случай (ако имате нужда от друга функционалност, освен членско копиране, тогава ще трябва да го внедрите сами, разбира се). Пример на живо - person dyp; 14.10.2013
comment
Отново редактирано. Отговорът ще се развие ли още сега? - person Atle; 14.10.2013
comment
@Atle Ad protected и обекти от производни класове: току-що го споменах като любопитен факт ;) Тук е без значение, но може да не съм се изразил ясно. Достъпът до защитени членове зависи от типа на обекта, който съдържа тези членове. Вие можете да имате достъп до защитените членове на обекти от вашия собствен клас и производни класове (дори ако тези членове са били декларирани в базов клас от вашия собствен клас), но не и до всеки обект от базов клас. - person dyp; 14.10.2013