C ++:一个结构可以inheritance一个类吗?

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

我注意到一个结构是从一个类inheritance,我暂停了思考它…

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

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

我猜在这种情况下,struct Binheritance了stuct中的所有数据。我们可以在一个struct中声明public / private成员吗?

但是我注意到这个:

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

从我的在线C ++手册:

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

即使类A有一些成员函数,上述inheritance是否有效? 当一个结构体inheritance它们的时候会发生什么? 那么相反呢:一个类从一个结构inheritance?

实际上,我有这个:

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

我用它来遍历它,就像这个foreach message in user_messages.messages

如果我想添加成员函数到我的结构,我可以改变它的声明和“提升”到一个类,添加function,仍然像我以前一样迭代我的user_messages.messages?

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

是的,结构可以inheritance自C ++中的类。

在C ++中, 除了关于成员的inheritance和访问级别的默认行为外类和结构是相同的

C ++类

  • 默认inheritance= 私有
  • 成员variables和函数的默认访问级别= private

C ++结构

  • 默认inheritance= public
  • 成员variables和函数的默认访问级别= public

在C ++中

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

相当于:

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

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

相当于:

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

这意味着一个结构/类的成员默认是public / private 。

使用struct也改变默认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可以从一个类inheritance。 classstruct关键字之间的区别只是默认的private / public说明符的变化。

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

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

主要的理解是结构来自C,而类是C ++。 这意味着尽pipe结构是一stream的面向对象的公民,但它们也有一个遗留的目的,这就是类别被分开的原因,而结构是默认访问公共的。 但是,一旦完成,他们绝对完全相同,可以在任何方面互换。

一个结构和一个类是一样的,除了一个类默认其成员为私有,而一个结构默认其成员为public。 因此,是的,你可以在两者之间inheritance。 在C ++中看到,我可以从一个结构派生一个类 。

结构和类几乎是可以互换的 – 只是在默认情况下默认为私有inheritance和成员的不同默认值,结构公开。 类关键字(而不是结构)必须用于例如。 “template <class T>”。

也就是说,很多程序员使用这两个来给程序员读代码提供一个小小的build议:通过使用一个结构,你可以巧妙地提出一个不太封装的OOdevise。 一个结构可能被用在一个库的内部,在这里所有的东西都是公平的游戏,而在API变化的边界上使用类会给客户带来不便,更好的抽象是有用的。 这个非常松散的约定已经从默认可访问性的差异中产生出来 – 懒惰/高效/简洁(随便你select)程序员做什么是最简单的,除非有其他好处,而且如果可能的话不打字的访问说明符是很好的。

是的,一个struct可以inheritance自一个类。 structclass只有在为成员设定的访问说明符和基类(或结构体)(如果没有在C ++中明确指定)的区别。 对于结构是public 。 对于类是private

您引用的句子是关于C ++中的类的概念,与C中的数据结构的概念相比较。在C ++中,引入了新的关键字 – class ,以更好地反映概念中的变化,但为了与在C中的代码,旧的关键字struct被遗留下来,它的含义如上所述。

是。 Struct可以从一个类inheritance,反之亦然。 可访问性规则是

$ 11.2 / 2-“在没有基类的访问说明符的情况下,假定在派生类被声明的时候是public的,当类被声明为class时,假定为struct和private。

编辑2:所以你可以改变你的课如:。 请注意,通常有公共数据成员是一个主意。

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

一个类不会公开inheritance结构。 结构将从一个类或一个结构公开inheritance。

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

B b; BA = 5; //好。 一个是可访问的

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

意思是一样的。 B b; BA = 5; //好。 一个是可访问的

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

B b; BA = 5; //不好。 一个是不可访问的

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

B b; BA = 5; //好。 一个是可访问的

最后:

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

B b; BA = 5; //不好。 一个是不可访问的

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

B b; BA = 5; //不好。 一个是不可访问的