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


70

我正在查看我正在使用的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?

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


1
stackoverflow.com/questions/577465/… 看起来像是这个问题的重复
ckv 2010年

是在类/结构内部还是外部的for_each循环?
Chubsdad

@chubsdad在外面。HTML模板递归地遍历messages.messages以呈现为HTML。
奥古斯丁2010年

1
@augustin:我最初的感觉是为“消息”类提供“迭代器”设计模式,而不是将成员“消息”公开。
Chubsdad

1
@augustin:虽然目前不相关,但是关键字“ struct”和“ class”之间的差别很小。关键字“类”可以与模板一起使用,但不能使用关键字“结构”来定义类型参数
Chubsdad 2010年

Answers:


112

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

在C ++中,类和结构除了在成员的继承和访问级别方面的默认行为外,均相同

C ++类

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

C ++结构

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

谢谢。很清楚 这是否意味着一个结构也可以具有成员函数,包括构造函数,并且我们可以像创建类一样创建一个新实例:<code> myObject = new myStruct(myVar)<code>?
奥古斯丁2010年

8
是。对类有效的任何内容对结构均有效。除了上面给出的访问修饰符外,它们是绝对完全相同的。混合它们或其他任何东西都没有限制。
小狗

@DeadMG:谢谢。很清楚 我一直在寻找重复项,但没有找到它们。我仍然很高兴问到。谢谢。
奥古斯丁2010年

3
您甚至可以将结构体声明为类,反之亦然,但是Visual C ++在某些情况下对此感到窒息。
Fabio Fracassi

3
我仍然将结构用于纯数据,并在需要成员函数时使用类,即使它们是相同的。习惯的力量。
亚历山大·拉弗蒂

40

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

相当于

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关键字之间的区别只是默认私有/公共说明符的变化。


1
这确实应该是选择的答案!非常清楚。
nathanesau

1
继承可访问性示例不正确。struct A{}; class B : A{};等价于class A{}; class B : private A {};。基的可访问性由派生的存在classstruct确定,而不由基的存在class或确定struct
Eljay

1
@Eljay,你是对的,我把例子混在一起了。我刚刚更新了答案。
maxschlepzig

7

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

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


6

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



4

struct和class几乎可以互换-只是具有不同的默认值,因为这些class默认为私有继承,而成员默认为public。class关键字(而非struct)必须用于例如。“模板<T类>”。

就是说,许多程序员都使用这两种方法为阅读代码的程序员提供了一些建议:通过使用结构,您在巧妙地建议了一种不太封装的OO设计。可以在库内部使用结构-充分利用它是公平的,而在API更改会给客户端带来不便的边界上使用类,更好的抽象很有用。这种非常宽松的约定源于默认可访问性的差异-懒惰/高效/简洁(请选择)程序员会做最简单的事情,除非有其他好处,并且在可能的情况下不要键入访问说明符。


4

是的,struct可以从类继承。struct并且class不同之处仅在假定成员接入说明符和用于基类(或结构),如果不是在C中明确指定++。对于结构是public。对于课程来说private

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


4

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

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

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

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

1

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

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; //不好。a无法访问

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

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

最后:

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.