我们假设我想要一个单独的Child类,并且只有这个类继承自Father 并授予Child访问Fathers数据成员的权限。除此之外,没有人应该从父亲那里继承到其内部,因此我保留了父亲私人的数据
编辑:我选择了保护,因为我想隐藏数据。有些人提倡这是一种良好的做法,但也许它有点过于教条:(例如,http://drdobbs.com/184403867中的Herb Sutter)实际上,这个课程应该只延长一次。因此,史蒂夫杰西普指出禁止继承可能是一种选择,但我认为其成本(虚拟等)对我所需要的东西来说太过分了。
代码看起来像这样:
class Father{
friend class Child;
public:
//functions
private:
int mData;
}
class Child: public Father{
public:
void changeData(int val){mData=val;}
}
我在这里遇到了一些严重的麻烦,或者这是一个有效的决定,假设继承是一个好的决定。
答案 0 :(得分:5)
这实际上并没有阻止其他人使用Father
作为基类,只是阻止他们访问mData
。
如果这是您想要的(Child
具有对Father
的特权访问权限,那么其他类没有,并且Child
碰巧也有一个基类{{ 1}}无关),很好。
如果你另外禁止其他人使用Father
作为基类(通过单独的文档,或者使用虚拟基类的技巧),那么使用Father
会变得有点无意义。你可能只是让friend
受保护而不是私有,这正是受保护的目的。
答案 1 :(得分:1)
protected:
访问说明符是出于完全相同的目的而引入的。
虽然这会授予会员访问 Child
的所有 Father
的权限,但从长远来看,此设计更清晰,更易于维护。
答案 2 :(得分:0)
如果Child
是唯一应该继承Father
的类,那么您可以在Father
中声明要转移到Child
的成员和方法(但是你仍然希望保密,而不是保密。
就像私人一样,受保护无法从外部访问。
与private相对,protected是继承的。