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

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

I noticed that a struct is inheriting from a class and I paused to ponder on it...

First, I didn't see in the C++ manual I studied with that a struct could inherit from another struct:

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

我想在这种情况下,struct B 继承自 stuct A 中的所有数据,我们可以在 struct 中声明 public/private 成员吗?

但我注意到:

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

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

类是数据结构的扩展概念: 它不仅可以保存数据,还可以保存 都有数据 and functions.

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

实际上,我有这个:

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

我过去常常像这个 foreach message in user_messages.messages一样迭代它。

如果我想将成员函数添加到结构中,我是否可以更改它的声明并将其“提升”为类,添加函数,同时仍然在 user _ message 上迭代。像我以前那样?

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

45735 次浏览

用 C + +

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

等同于:

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

还有

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

等同于:

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

这意味着结构/类 默认为公共/私人的成员。

struct也用于 更改默认继承public,即。

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

is equivalent to

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关键字之间的区别仅仅是默认 private/public 说明符的更改。

Struct 和 class 基本上是可以互换的——只是缺省值不同,类默认为私有继承,成员,结构默认为公共。Class 关键字(而不是 struct)必须用于例如“ template < class T >”。

也就是说,许多程序员使用这两种方法给正在阅读代码的程序员一个小小的建议: 通过使用结构,您可以巧妙地建议使用更少封装的 OO 设计。一个结构可以在库内部使用——在库内部使用结构的核心是公平的,而类在 API 更改会给客户机带来不便的边界上使用,更好的抽象是有用的。这种非常松散的约定源于缺省可访问性的不同——懒惰/高效/简洁(请自行选择)程序员做最简单的事情,除非有其他好处,如果可能的话,不键入访问说明符是很好的。

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

However, there is usually a difference in how structs and classes are used that is not mandated by the standard. structs are often used for pure data, ( or objects without polymorphism depending on your projects preference) and classes are used for the other cases. I emphasise that this is just a stylistic difference and not required.

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

In C++, 类和结构是相同的,除了它们的默认行为 with regards to inheritance and access levels of members.

C + + 级

  • Default Inheritance = 二等兵
  • 成员变量和函数的默认访问级别 = 二等兵

C + + struct

  • 默认继承 = 公众人士
  • 成员变量和函数的默认访问级别 = 公众人士

Struct 与类是一样的,只不过类将其成员默认为 private,而 struct 将其成员默认为 public。因此,是的,你可以在两者之间继承。参见 在 C + + 中,我可以从一个结构派生一个类吗

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

$11.2/2- "In the absence of an 基类的访问说明符, 当派生的 类声明为 struct 和 private 在声明该类时假定 class."

编辑2: 因此,您可以将类更改为: . 请注意,通常使用公共数据成员是 很糟糕的想法。

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

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

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

要理解的主要事情是结构来自 C,而类是 C + + 。这意味着,虽然 structs 是一流的面向对象的公民,但它们也有一个遗留的用途,这就是为什么类是独立的,而 structs 是默认访问公共的原因。然而,一旦完成了这项工作,它们在各个方面都是完全相同的,可以互换的。

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

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

B b; b.a=5; //OK. a is accessible

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

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

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

B b; b.a=5; //NOT OK. a is NOT accessible

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;//NOT OK. a 不可访问

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

B b; A = 5;//NOT OK. a 不可访问