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
}
}
在上面的代码中,我在访问和创建private
类中base
说明符下的结构对象时遇到错误。
请告诉我为什么我能够直接创建结构变量,但不能在派生类中使用base
类对象。
答案 0 :(得分:0)
您在基类中声明私有类型:struk1。这意味着只能在基类中访问此类型。然后你声明这种类型的私有实例s1。
我很惊讶你的编译器在这里没有抱怨:
struct struk1 s2; // Works Fine
您正在声明struk1类型的实例s2,它是PRIVATE,因此派生类无法访问它。 VS2013编译器并不能说它有效。
如上所述,您正在引用私有的base :: struk1类型。这是内部类的详细信息,它们封装在基类中。
base::struk1 s3; // Error is given => 'struct base::struk1' is private
您是否希望派生类可以访问它,将struk1类型声明为protected。如果您希望每个人都可以将此类型称为base :: struk1,请将其公之于众。
在派生类中,您已声明了s2实例,因此在派生类中访问其a1字段没有问题(假设您使struk1类型至少受基类保护:
s1.a1 = x;
我们来到这一行:
b1.s1.a1 = x; // Error => 'base::struk1 base::s1' is private
您在派生类中声明了基类型的b1实例。您尝试访问其私有实例s1。私有意味着它在声明的类中是可见的,因此难怪你无法在外部访问它。在派生类中声明基本b1实例并不重要,您试图修改b1私有内部,这是不允许的。保护它并没有帮助。如果你想做b1.s1.a1 = x;
,你需要公开它答案 1 :(得分:0)
只能在声明它们的类中访问私有数据成员。 如果要在派生类中访问它们,请将它们设为public或protected。