C ++:结构可以从类继承吗?

时间:2010-08-26 10:05:55

标签: c++ class inheritance struct

我正在查看我正在使用的API的实现。

我注意到一个结构继承自一个类,我暂停思考它......

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

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

我想在这种情况下,struct 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一样迭代它。

如果我想在我的struct中添加成员函数,我是否可以更改其声明并将其“提升”为类,添加函数,并像我之前一样迭代我的user_messages.messages?

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

9 个答案:

答案 0 :(得分:102)

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

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

C ++类

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

C ++ struct

  • 默认继承= 公开
  • 会员变量和函数的默认访问级别= 公开

答案 1 :(得分:37)

在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的成员。

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

摘要:是的,struct可以从类继承。 classstruct关键字之间的差异只是默认私有/公共说明符的更改。

答案 2 :(得分:7)

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

但是,标准没有规定的结构和类的使用方式通常有所不同。结构通常用于纯数据(或根据您的项目首选项没有多态的对象),并且类用于其他情况。我强调这只是一种风格差异而不是必需的。

答案 3 :(得分:6)

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

答案 4 :(得分:5)

结构与类相同,只是类默认其成员为private,而struct默认其成员为public。结果,是的,你可以在两者之间继承。请参阅in C++, can I derive a class from a struct

答案 5 :(得分:4)

struct和class几乎可以互换 - 只是使用不同的默认值,类默认为私有继承,成员,结构为public。必须使用class关键字(而不是struct)。 “template&lt; class T&gt;”。

也就是说,许多程序员使用这两个程序员给程序员读取代码提出了一个小小的建议:通过使用结构,你巧妙地暗示了一个封装较少的OO设计。一个结构可能在库内部使用 - 其中所有内容都是公平的游戏,而类在API的改变会给客户带来不便并且更好的抽象是有用的边界上使用。这个非常松散的约定已经超出了默认可访问性的差异 - 懒惰/高效/简洁(随你选择)程序员做最简单的事情,除非有其它好处,并且在可能的情况下不打字访问说明符很好。

答案 6 :(得分:4)

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

  

$ 11.2 / 2-“没有   基类的访问说明符,   派生时假定公众   class声明为struct和private   在声明类时假定   类“。

编辑2: 所以你可以改变你的课程:请注意,通常使用公共数据成员是糟糕的想法。

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:1)

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

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

B b; b.a = 5; //好。 a可以访问

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

意思相同。 B b; b.a = 5; //好。 a可以访问

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

B b; b.a = 5; //不好。 a无法访问

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

B b; b.a = 5; //好。 a可以访问

最后:

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

B b; b.a = 5; //不好。 a无法访问

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

B b; b.a = 5; //不好。 a无法访问