2011-12-01 73 views
0

访问私有成员,这是我的代码:不能使用基类朋友类

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' 

更重要的是我必须做的,从基本访问我的私有成员?

回答

6

friend声明意味着,​​获得访问它在​​范围。

如果你想有一个类的用户可以访问的东西,在某些时候,你需要写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(); 
}; 
+0

或'使用Base :: getN;',如果冗长不是你的东西。 –

+0

@MikeSeymour:哦,哦,让我补充一点。 – GManNickG

1

main的代码是不是要访问​​方法,它试图访问一个Base方法 - 这就是为什么它不工作。

尝试​​添加一个覆盖:

virtual int getN() 
{ 
    return Base::getN(); 
} 
0

getN()从未公开,所以tmain()不能调用它。

让一个子类成为基类的朋友并不是正确的方法。这是对类型系统的混淆颠覆。如果你想从一个子类访问一个基类的非公共成员,但没有公开它们,就要保护它们。

2

为什么不只是宣布nprotected