代码之家  ›  专栏  ›  技术社区  ›  augustin

C++可以从一个类继承吗?

  •  59
  • augustin  · 技术社区  · 14 年前

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

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

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

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

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

    但我注意到:

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

    从我的在线C++手册:

    类是数据结构的扩展概念:它不能只保存数据,而是可以保存 二者都 数据 以及功能。

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

    实际上,我有:

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

    我经常这样重复它 foreach message in user_messages.messages .

    如果我想将成员函数添加到我的结构中,我可以更改它的声明并将其“提升”到类中,添加函数,然后像以前那样循环访问用户的messages.messages吗?

    显然,我还是一个新手,我仍然不清楚结构和类是如何相互作用的,二者之间的实际区别是什么,继承规则是什么……

    9 回复  |  直到 7 年前
        1
  •  101
  •   Community CDub    10 年前

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

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

    C++类

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

    C++结构

    • 默认继承= 公众的
    • 成员变量和函数的默认访问级别= 公众的
        2
  •  37
  •   maxschlepzig    7 年前

    在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 inheritance public ,即

    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 { };
    

    是的,A 结构 无法从类继承。两者之间的区别 class 结构 关键字只是默认的私有/公共说明符中的一个更改。

        3
  •  7
  •   Michael Anderson    14 年前

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

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

        4
  •  6
  •   Puppy    14 年前

    要理解的主要是结构来自C,而类是C++。这意味着尽管结构是第一类面向对象的公民,但它们也有一个遗留目的,这就是类被分离和结构是默认访问公共的原因。然而,一旦这样做了,他们是绝对和完全相同的,并在各个方面相互交换。

        5
  •  5
  •   Community CDub    7 年前

    结构与类是相同的,只是类默认其成员为private,而结构默认其成员为public。因此,是的,您可以在两者之间继承。见 in C++, can I derive a class from a struct .

        6
  •  4
  •   Tony Delroy    14 年前

    结构和类几乎是可以互换的——只是在类中有不同的默认值,默认为私有继承,成员,结构为公共。类关键字(而不是结构)必须用于例如“template<class t>”。

    也就是说,许多程序员使用这两种方法来给阅读代码的程序员一个小小的建议:通过使用一个结构,你巧妙地建议一种封装性较低的OO设计。结构可以在库内部使用——在库中,获取所有内容都是公平的游戏,而类在边界上使用,在边界上,API更改会给客户端带来不便,更好的抽象是有用的。这种非常松散的约定源于默认的可访问性的差异——懒惰/高效/简洁(任选)程序员做最简单的事情,除非有其他好处,如果可能,不输入访问说明符是很好的。

        7
  •  4
  •   Maciej Hehl    14 年前

    是的 struct 无法从类继承。 结构 class 只有在C++中没有明确指定的成员和基类(或结构)的访问说明符才不同。对于结构来说 public . 对于课堂来说 private .

    你从手册中引用的句子是关于C++中一个类的概念,与C++中的C.中的数据结构的概念相比, 是为了更好地反映概念的变化而引入的,但是为了与C中的代码兼容,一个旧的关键字 结构 它的意思如上所述。

        8
  •  4
  •   Chubsdad    14 年前

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

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

    编辑2: 因此,您可以将类更改为:。注意这是一个 坏的 通常有公共数据成员的想法。

    class user_messages {  // i also changed the name when OP was modified :)
    public:   
       std::list<std::string> messages;  
    };
    
        9
  •  1
  •   Domonkos Tóth-Lőrincz    9 年前

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

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

    B; b. A=5;//ok。A是可访问的

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

    意思是一样的。 B; b. A=5;//ok。A是可访问的

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

    B; b.a=5;//不正常。A无法访问

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

    B; b. A=5;//ok。A是可访问的

    最后:

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

    B; b.a=5;//不正常。A无法访问

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

    B; b.a=5;//不正常。A无法访问