这个答案似乎表明它应该工作,所以我的例子为什么会出现编译器错误:
class Class1
{
protected:
long m_memberVar;
};
class SubClass1: public Class1
{
public:
void PrintMember(Class1 memberToPrintFrom)
{
Console::Write("{0}", memberToPrintFrom.m_memberVar); // <-- Compiler error: error C2248: 'BaseClassMemberAccess::Class1::m_memberVar' : cannot access protected member declared in class 'BaseClassMemberAccess::Class1'
}
};
Run Code Online (Sandbox Code Playgroud)
[编辑] - 在Need4Sleep的建议中将子类更改为公共继承,但没有区别.
Lig*_*ica 13
在这个答案中,我将假设您public在代码中使用了继承(问题中缺少该继承).
[C++11: 11.2/1]:如果使用public访问说明符将类声明为另一个类的基类(第10节),public则可以作为public派生类的protected成员protected访问基类的成员,并且可以作为派生类的成员访问基类的成员.如果使用protected访问说明符将类声明为另一个类的基类,则可以作为派生类的成员访问基类的成员public和protected成员protected.如果使用private访问说明符将类声明为另一个类protected的基类,则可以作为private派生类的成员访问基类的public和成员.
这包括您访问同一对象的成员的情况.
但是,对protected成员访问有一点好奇心,为了访问另一个对象的protected成员,它必须位于相同类型的定义或更多派生类型中; 在您的情况下,它是一个较少派生的类型(即基数):
[C++11: 11.4/1]:当非静态数据成员或非静态成员函数是其命名类的受保护成员时,将应用超出第11章中所述之外的其他访问检查(11.2)如前所述,授予对受保护成员的访问权限,因为引用发生在朋友或某个类的成员中C.如果访问要形成指向成员的指针(5.3.1),则嵌套名称说明符应表示C或派生自的类C.所有其他访问都涉及(可能是隐式的)对象表达式(5.2.5).在这种情况下,对象表达式C的类应该是派生自的类C.
也就是说,您必须从Class1成员函数中运行此代码.
Bjarne在他的书"C++编程语言"(Sp.Ed.)第404页中提到了这一点:
派生类只能为自己类型的对象访问基类'protected members [...]这可以防止在一个派生类破坏属于其他派生类的数据时可能发生的细微错误.