【问题标题】:Can't access protected class member in a derived class无法访问派生类中的受保护类成员
【发布时间】:2023-10-01 21:41:01
【问题描述】:

错误是:

d_startCourseActivity 的受保护成员
durationCourseActivity 的受保护成员
locationCourseActivity 的受保护成员

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 

【问题讨论】:

  • 是什么导致了错误?这里没有代码可以做到这一点。
  • 您只能从父对象的后代访问父对象的受保护方法。这里,oActivity 不是新创建对象的父对象,因此无法访问其受保护的成员。
  • 或者它可能是 this question 的副本。无论如何,它是重复的。
  • 谢谢,这是重复的。我道歉

标签: c++ inheritance protected access-specifier


【解决方案1】:

您正在将CourseActivity 的实例传递给函数Lecture::Lecture。即使CourseActivity 确实是Lecture 的基类,您也无法从外部访问受保护的类成员(如_oActivity.duration),即使您正在操作的对象是派生类型。

为了避免你的特殊问题,你可以在基类中创建这个构造函数

CourseActivity::CourseActivity(const CourseActivity &_oActivity)

并调用它

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

在派生类中。在基类中,您可以访问受保护的成员,而不是在派生类中,这是不允许的。

【讨论】:

  • "你传入的实例不一定和当前基类一样" 你指的是引用const CourseActivity&吗?传值时甚至不允许。
  • 当你访问_oActivity.duration时,你是从外部访问CourseActivity类,这意味着不能访问受保护的或私有的成员。这在代码中的哪个位置无关紧要,它甚至可能在同一个类中。
  • 代码可能在类CourseActivity本身中;在这种情况下,它是允许的。 Live example
  • 是的。你不能(= asker)将整个_oActivity 传递给CourseActivity 的构造函数吗?
  • 是的,我也在对 OP 的评论中建议了这一点。在考虑了一段时间之后,我什至建议这样做。基类负责复制,这不应该是派生类的工作。
最近更新 更多