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++类后面带一个:什么意思 class CAboutDlg : public CDialog//什么意思? public: CAboutDlg(); 求解释