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

Posted

技术标签:

【中文标题】C ++访问派生类中基的私有结构【英文标题】:C++ Accessing private structure of base in derive class 【发布时间】:2017-08-07 06:48:15 【问题描述】:
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 类中 private 说明符下的结构对象时遇到错误。

请告诉我为什么我可以直接创建结构变量,但不能使用派生类中的base 类对象。

【问题讨论】:

你用的是什么编译器? Clang rejects your code with an expected error. 我使用了来自 cpp.sh 的基于 Web 的编译器,我的代码的 URL 是 cpp.sh/4zfre/ 网站cpp.sh上提到'系统使用GCC 4.9.2,Boost 1.55可用' 在我看来像一个 gcc 错误。 是的,我在 Code Block & Visual Studio 上检查过,上面的代码给出了 'struct struk1 s2; 的错误; ' 所以最初的问题是由于 cpp.sh 的网络编译器的编译器错误 【参考方案1】:

您在基类中声明私有类型: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 类型声明为受保护。如果您希望每个人都可以将此类型称为 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;

,你需要把它公开

【讨论】:

感谢您的回复。问题在于我用来编译此代码的编译器。我使用了来自 cpp.sh 的在线编译器,它给了我上述结果。但是在查看了 cmets 之后,我使用 Code Block 对其进行了编译,结果符合预期。这行代码 struct struk1 s2;在 cpp.sh 上运行良好的编译器在代码块上显示错误【参考方案2】:

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

【讨论】:

以上是关于C ++访问派生类中基的私有结构的主要内容,如果未能解决你的问题,请参考以下文章

C++_练习—继承_公有继承

C++ 派生类访问属性

[c++]第五章概念题 | 继承

关于 C++ 中的类派生的问题?

c++类后面带一个:什么意思 class CAboutDlg : public CDialog//什么意思? public: CAboutDlg(); 求解释

继承