【问题标题】:C++: Can a struct inherit from a class?C ++:结构可以从类继承吗?
【发布时间】:2011-04-04 04:40:12
【问题描述】:

我正在研究我正在使用的 API 的实现。

我注意到一个结构是从一个类继承的,我停下来思考它......

首先,我没有在我研究的 C++ 手册中看到一个结构可以从另一个结构继承:

struct A {};
struct B : public A {};

我猜在这种情况下,结构 B 继承自结构 A 中的所有数据。我们可以在结构中声明公共/私有成员吗?

但我注意到了这一点:

 class A {};
 struct B : public A {};  

来自我的在线 C++ 手册:

类是数据结构的扩展概念:它不仅可以保存数据,还可以保存数据和函数。

即使类 A 有一些成员函数,上述继承是否有效?当结构继承它们时,函数会发生什么?反过来呢:从结构继承的类?

实际上,我有这个:

struct user_messages {
  std::list<std::string> messages;
};

我曾经像 foreach message in user_messages.messages 这样迭代它。

如果我想将成员函数添加到我的结构中,我可以更改它的声明并将其“提升”为一个类,添加函数,并且仍然像以前一样迭代我的 user_messages.messages 吗?

显然,我还是个新手,还不清楚结构体和类之间是如何交互的,两者的实际区别是什么,继承规则是什么……

【问题讨论】:

  • stackoverflow.com/questions/577465/… 看起来像这个问题的重复
  • for_each 循环是在类/结构内部还是外部?
  • @chubsdad 它在外面。 HTML 模板递归遍历 messages.messages 以呈现为 HTML。
  • @augustin:我最初的感觉是为“messages”类提供一个“迭代器”设计模式,而不是让成员“messages”公开。
  • @augustin:虽然目前不相关,但关键字'struct'和'class'有一点区别。关键字“class”可以与模板一起使用,但不能使用关键字“struct”来定义类型参数

标签: c++ class inheritance struct


【解决方案1】:

是的,struct 可以从 C++ 中的类继承。

在 C++ 中,类和结构是相同的,除了它们的默认行为关于成员的继承和访问级别。

C++类

  • 默认继承 = 私有
  • 成员变量和函数的默认访问级别 = private

C++ 结构

  • 默认继承 = public
  • 成员变量和函数的默认访问级别 = public

【讨论】:

  • 谢谢。这很清楚。这是否意味着结构也可以具有成员函数,包括构造函数,并且我们可以像为类创建一个新实例:myObject = new myStruct(myVar)?
  • 是的。任何对类有效的东西都对结构有效。除了上面给出的访问修饰符之外,它们绝对完全相同。混合它们或任何东西没有限制。
  • @DeadMG:谢谢。这很清楚。我一直在寻找重复项,但没有找到。我仍然很高兴我问了。谢谢。
  • 你甚至可以将一个结构体前向声明为一个类,反之亦然,但在某些情况下,Visual C++ 会对此感到窒息。
  • 我仍然将结构用于纯数据,并在需要成员函数时使用类,即使它们是相同的。习惯的力量。
【解决方案2】:

在 C++ 中

struct A { /* some fields/methods ... */ };

相当于:

class A { public: /* some fields/methods ... */ };

class A { /* some fields/methods ... */ };

相当于:

struct A { private: /* some fields/methods ... */ };

这意味着结构/类的成员are by default public/private

使用struct 也使用changes the default inheritancepublic,即

struct A { }; // or: class A { };
class B : A { };

等价于

struct A { }; // or: class  A { };
struct B : private A { };

反之,这个

struct A { }; // or: class A { };
struct B : A { };

相当于:

struct A { }; // or: class A { };
class B : public A { };

总结:是的,struct 可以从类继承。 classstruct 关键字之间的区别只是默认私有/公共说明符的变化。

【讨论】:

  • 这真的应该是选择的答案!很清楚。
  • 继承可访问性示例不正确。 struct A{}; class B : A{}; 等价于 class A{}; class B : private A {};。基的可访问性由派生的classstruct 决定,而不是由基的classstruct 决定。
  • @Eljay,你是对的,我把例子弄混了。我刚刚更新了我的答案。
【解决方案3】:

结构和类之间的唯一区别是成员的默认访问级别(类的私有,结构的公共)。这意味着结构应该能够从类继承,反之亦然。

但是,结构和类的使用方式通常存在差异,这不是标准规定的。结构通常用于纯数据(或没有多态性的对象,具体取决于您的项目偏好),而类用于其他情况。我强调这只是风格上的差异,不是必需的。

【讨论】:

    【解决方案4】:

    要理解的主要内容是结构来自 C,而类是 C++。这意味着虽然结构是一等的面向对象的公民,但它们也有一个遗留的目的,这就是类是分开的,结构是默认访问公共的原因。但是,一旦完成,它们就绝对完全相同,并且在各个方面都可以互换。

    【讨论】:

      【解决方案5】:

      结构体和类是一样的,除了一个类默认它的成员是私有的,而一个结构体默认它的成员是公有的。结果,是的,您可以在两者之间继承。见in C++, can I derive a class from a struct

      【讨论】:

        【解决方案6】:

        struct 和 class 几乎可以互换——只是在默认情况下,类默认为私有继承和成员,结构为公共。例如,必须使用 class 关键字(而不是 struct)。 “模板”。

        也就是说,许多程序员使用这两者来给阅读代码的程序员一个小小的建议:通过使用结构,您巧妙地暗示了一种不那么封装的 OO 设计。结构体可以在库内部使用——在其中深入了解它是公平的游戏,而在 API 更改会给客户端带来不便并且更好的抽象很有用的边界上使用类。这种非常松散的约定源于默认可访问性的差异 - 懒惰/高效/简洁(随您选择)程序员会做最简单的事情,除非有其他好处,并且尽可能不输入访问说明符。

        【讨论】:

          【解决方案7】:

          是的,struct 可以从类继承。 structclass 的不同之处仅在于为成员和基类(或结构)假定的访问说明符(如果未在 C++ 中明确指定)。对于结构,它是public。对于课程,它是private

          您从手册中引用的那句话是关于 C++ 中的类的概念,与 C 中的数据结构的概念相比。在 C++ 中引入了新关键字 - class 以更好地反映概念的变化,但为了兼容C语言,留下了一个旧关键字struct,其含义如前所述。

          【讨论】:

            【解决方案8】:

            是的。结构可以从一个类继承,反之亦然。可访问性规则是

            $11.2/2-“在没有 基类的访问说明符, 当派生时假定公共 类被声明为结构和私有 在声明类时假定 类。”

            编辑 2: 因此,您可以将您的课程更改为:。请注意,通常拥有公共数据成员是一个不好的主意。

            class user_messages {  // i also changed the name when OP was modified :)
            public:   
               std::list<std::string> messages;  
            };
            

            【讨论】:

              【解决方案9】:

              类不会公开继承自结构。结构将公开继承自类或结构。

              class A
              {
              public:
                  int a;
              };
              struct B : A
              {};
              

              Bb; b.a=5; //好的。 a 是可访问的

              class A
              {
              public:
                  int a;
              };
              struct B : public A
              {};
              

              意思是一样的。 乙乙; b.a=5; //好的。 a 是可访问的

              struct A
              {int a;};
              class B : A
              {};
              

              Bb; b.a=5; //不好。 a 不可访问

              struct A
              {int a;};
              class B : public A
              {};
              

              Bb; b.a=5; //好的。 a 是可访问的

              最后:

              class A
              {int a;};
              class B : A
              {};
              

              Bb; b.a=5; //不好。 a 不可访问

              class A
              {int a;};
              class B : public A
              {};
              

              Bb; b.a=5; //不好。 a 不可访问

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-10-07
                • 1970-01-01
                • 2010-10-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多