C++ 在派生中访问基的私有结构 class

C++ Accessing private structure of base in derive class

class base
{
    struct struk1
    {
        int a1;  
    };

    struct struk1 s1;

public:

    base(int x)
    {              
        s1.a1 = x;          
    }  

    base() {}
};

class b : public base
{
    struct struk1 s2; // Works Fine    
    base::struk1 s3;  // Error is given => 'struct base::struk1' is private
    base b1;

public:     
    b(int x, int y) : base(y)
    {    
        s2.a1 = x;    // Works Fine
        b1.s1.a1 = x; // Error => 'base::struk1 base::s1' is private
    } 
}

在上面的代码中,我在访问和创建位于 base class.

中的 private 说明符下的结构对象时出错

请告诉我为什么我可以直接创建一个结构变量,而不是通过在派生的 class.

中使用 base class 对象

您正在声明私有类型:base class 中的 struk1。这意味着此类型只能在基 class 中访问。然后声明这种类型的私有实例 s1。

我很惊讶你的编译器没有在这里抱怨:

struct struk1 s2; // Works Fine  

您正在声明类型为 struk1 的实例 s2,它是私有的,因此派生 class 无法访问它。 VS2013 编译器没有说它可以工作。

如上所述,您指的是私有的 base::struk1 类型。这是内部 class 细节,封装在基础 class.

base::struk1 s3;  // Error is given => 'struct base::struk1' is private

您希望派生的 classes 能够访问它吗,将 struk1 类型声明为受保护的。如果您希望每个人都可以将此类型称为 base::struk1,请将其设为 public.

在 derived class 中你已经声明了 s2 实例,所以通过 in derived class 访问它的 a1 字段没有问题(假设你使 struk1 类型至少在 base class 中受保护:

s1.a1 = x;

我们来到这一行:

b1.s1.a1 = x; // Error => 'base::struk1 base::s1' is private

您在派生 class 中声明了基类型的 b1 实例。您尝试访问其私有实例 s1。私有意味着它在声明的 class 内是可见的,所以难怪你不能从外部访问它。您在派生 class 中声明基 b1 实例并不重要,您正在尝试修改 b1 私有内部结构,这是不允许的。使其受到保护并没有帮助。如果你想做 b1.s1.a1 = x;

,你需要把它设为 public

私有数据成员只能在声明它们的 class 内访问。 如果您想在派生的 classes 中访问它们,请将它们设置为 public 或受保护。