C ++在派生类

时间:2017-08-07 06:48:15

标签: c++ object inheritance structure private-members

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类对象。

2 个答案:

答案 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。