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 或受保护。
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 或受保护。