C++ Can';t访问派生类中受保护的类成员

C++ Can';t访问派生类中受保护的类成员,c++,inheritance,protected,access-specifier,C++,Inheritance,Protected,Access Specifier,错误是: d_start是CourseActivity的受保护成员 duration是CourseActivity location是CourseActivity 您正在将CourseActivity的实例传递给函数teaching::teaching。即使CourseActivity确实是讲座的基类,您也无法从外部访问受保护的类成员(如\u oActivity.duration),即使您操作的对象是派生类型的 为了避免您的特殊问题,您可以在基类中创建此构造函数 CourseActivity::

错误是:

d_start
CourseActivity

的受保护成员
duration
CourseActivity

location
CourseActivity


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

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

CourseActivity::CourseActivity(const CourseActivity &_oActivity)
并称之为

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

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

导致错误的原因可能重复?这里没有这样做的代码。您只能从父对象的降序对象访问父对象的受保护方法。在这里,oActivity不是新创建对象的父对象,因此无法访问其受保护的成员。或者,它可能是的副本。不管怎样,这是一个副本。谢谢你,这是一个副本。很抱歉,“您传递的实例不一定与当前基类相同”您是指引用
const CourseActivity&
?通过值传递时甚至不允许。当您访问
\u oActivity.duration
时,您是从外部访问
CourseActivity
类,这意味着无法访问受保护或私有成员。这与代码的位置无关,甚至可能在同一个类中。代码可能在类
CourseActivity
本身中;在这种情况下,这是允许的。对。你能不能把整个
\o活动
传递给
课程活动的构造函数
?是的,我在对OP的评论中也提出了这个建议。想了一会儿之后,我甚至建议这样做。基类负责复制,而不是派生类的工作。
Lecture::Lecture(const CourseActivity& _oActivity, const std::string& _topic)
    : CourseActivity(_oActivity)