2013-10-14 193 views
0

的錯誤是:無法訪問受保護的類成員在派生類中

d_startCourseActivity
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

[訪問受保護的繼承成員與指向基類的指針]的可能的重複(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

當您訪問'_oActivity.duration'時,您從外部訪問'CourseActivity'類,這意味着受保護或私有成員無法訪問。無論代碼在哪裏,它甚至可能在同一個類中。 – Atle

+0

代碼可能在「CourseActivity」類本身中;在這種情況下,它是被允許的。 [Live example](http://coliru.stacked-crooked.com/a/05073431636e9459) – dyp

相關問題