是否可以将友谊与继承结合起来访问私有数据成员?
Is it ok to combine friendship with inheritance to access private data members
让我们假设我想要一个单一的类Child,并且只有这个类继承自Father并授予Child对father数据成员的访问权。除此之外,任何人都不应该继承father来访问它的内部,因此我将father的数据保留为私有
编辑:我选择不保护,因为我想要隐藏数据。有些人认为这是一个很好的实践,但也许这有点太教条了:(例如Herb Sutter在http://drdobbs.com/184403867)实际上,这个类应该只扩展一次。因此,正如Steve Jessop指出的那样,禁止继承将是一个选择,但我认为这样做的成本(虚拟等)对我所需要的来说太大了。
代码看起来像这样:
class Father{
friend class Child;
public:
//functions
private:
int mData;
}
class Child: public Father{
public:
void changeData(int val){mData=val;}
}
我在这里遇到了一些严重的问题吗?或者假设继承首先是一个好决定,那么这是一个有效的决定吗?
这实际上并没有阻止其他人使用Father
作为基类,它只是阻止他们访问mData
,如果他们这样做。
如果这就是你想要的(Child
有特权访问Father
,其他类没有,Child
碰巧也有一个基类Father
是无关的),很好。
如果您另外禁止任何人使用Father
作为基类(无论是单独通过文档,还是使用虚拟基类的技巧),那么使用friend
就变得有点毫无意义了。您不妨将mData
设置为protected而不是private,这正是protected的作用。
protected:
访问说明符的引入也是出于同样的目的。
虽然这将授予成员访问所有Father
的 Child
,但从长远来看,这种设计更简洁,更易于维护。
如果Child
是唯一一个应该继承Father
的类,那么你可以在Father
中声明那些你想转移到Child
的成员和方法(但你仍然想从其他类中保持"secret")保护而不是私有。
就像private一样,protected不能从外部访问。
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- std::vector的包装器,使数组的结构看起来像结构的数组
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 为什么示例代码访问IUnknown中已删除的内存
- C++:无法访问声明的受保护成员
- 是否可以将友谊与继承结合起来访问私有数据成员?