无法使用朋友类从基类访问私有成员

时间:2011-12-01 19:42:24

标签: c++

这是我的代码:

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访问我的私人会员?

4 个答案:

答案 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()无法调用它。

使子类成为基类的朋友无论如何都不是正确的方法。这是类型系统的令人困惑的颠覆。如果要从子类访问基类的非公共成员但不公开它们,请将它们保护。