友谊与继承

时间:2011-01-27 20:07:15

标签: c++ inheritance friend protected access-control

我下面是类层次结构。基本上,我想在类Foo和CComplexMat之间建立一个“has-a”关系,即类Foo“has-a”CComplexMat。 据我所知,无法从定义它们的类外部访问类的privateprotected成员。

但是,允许其他类访问此类成员有两种可能性。 第一个是使用friend类。我可以在friend class Foo<T>;的声明中添加一行class CComplexMat<T>,以便这样做 Foo<T>可以访问protected的{​​{1}}和private成员。

第二种可能性是使用class CComplexMat<T>,这是我在示例中选择的解决方案。在这种情况下,我正在考虑inheritance继承 publicpublicprotected成员均可在课程class CComplexMat<T>中访问。但是,显示以下错误:

Foo<T>

error: ‘CMatrix<float>* CComplexMatrix<float>::m_pReal’ is protected

  1. 我想知道是否有人可以对这个漏洞有所了解?
  2. 在哪些情况下“友谊”或“遗产”更合适?
  3. error: within this context

4 个答案:

答案 0 :(得分:4)

继承只应用于“is-a”关系。我认为CComplexMat<T>有两个CMatrix<T>成员,但事实并非如此“是一个”CMatrix<T>。与FooCComplexMat<T>类似的处理。

因此,继承几乎肯定不是正确的解决方案。离开:

  • 使用friend允许在密切相关的类之间进行访问。
  • 使用公共访问器方法允许类的用户以有限的方式“访问”私人成员。

例如,CComplexMat<T>应该有真实和虚构部分的私有成员,但也有一些访问者,如:

public:
    const CMatrix<T>& realPart() const;
    CMatrix<T>& realPart();
    const CMatrix<T>& imagPart() const;
    CMatrix<T>& imagPart();

答案 1 :(得分:0)

您正在Foo类中访问CComplexMat的局部变量,而不是仅访问父类以获取pReal的值。

这个tutorial打破了C ++中友谊和继承之间的差异 请注意他们如何直接访问父类的成员变量,而没有父类类型的本地成员。这可能是您想要在示例中执行的操作。

答案 2 :(得分:0)

即使尝试访问的类是包含受保护成员的类的子类,也无法从类外部访问受保护的成员。

在您的示例中,如果pComplex指向Foo类型的对象,则可以按照您尝试的方式访问pReal。

答案 3 :(得分:0)

根据C ++标准,关于派生类中受保护成员的访问(11.5)

  

除了形成指向成员(5.3.1)的指针外,访问必须通过a   指向派生类本身(或从该类派生的任何类)的指针,引用或对象

您正尝试通过基类访问pReal。

让CComplexMat的Foo朋友访问它的成员。