这是我的代码:
class Base
{
friend class SubClass;
int n;
virtual int getN()
{
return n;
}
};
class SubClass: public Base
{
public:
SubClass() {}
SubClass(const SubClass& s) {}
};
int _tmain(int argc, _TCHAR* argv[])
{
SubClass s;
int x = s.getN();
return 0;
}
error C2248: 'Base::getN' : cannot access private member declared in class 'Base'
我还需要做些什么来从Base访问我的私人会员?
答案 0 :(得分:6)
您的friend
声明表示SubClass
可以在SubClass
的范围内访问。
如果您希望某个类的用户访问某些内容,那么在某些时候您需要编写public:
函数:
class SubClass : public Base
{
public:
int getN()
{
return Base::getN();
}
};
您可以编写using声明以将基类函数引入当前类:
class SubClass : public Base
{
public:
// getN is considered declared at this point now (in public)
using Base::getN();
};
答案 1 :(得分:2)
为什么不直接将n
声明为protected
?
答案 2 :(得分:1)
main
中的代码并未尝试访问SubClass
方法,而是尝试访问Base
方法 - 这就是它无效的原因。
尝试在SubClass
中添加覆盖:
virtual int getN()
{
return Base::getN();
}
答案 3 :(得分:0)
getN()
永远不公开,所以tmain()无法调用它。
使子类成为基类的朋友无论如何都不是正确的方法。这是类型系统的令人困惑的颠覆。如果要从子类访问基类的非公共成员但不公开它们,请将它们保护。