С++: Может ли структура наследовать от класса?

Я рассматриваю реализацию API, который я использую.

Я заметил, что структура наследуется от класса, и я сделал паузу, чтобы обдумать это...

Во-первых, я не видел в руководстве на С++, которое я изучил, с тем, что структура может наследовать из другой структуры:

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

Я предполагаю, что в таком случае struct B наследует от всех данных в stuct A. Можем ли мы объявить публичных/частных членов в структуре?

Но я заметил это:

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

Из моего онлайн-справочника по С++:

Класс - это расширенная концепция структуры данных: вместо хранения только данных она может содержать как данные , так и функции.

Является ли указанное наследование действительным, даже если класс A имеет некоторые функции-члены? Что происходит с функциями, когда структура наследует их? А как насчет обратного: класс, наследующий от структуры?

Практически, у меня есть это:

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

И я использовал для этого итерацию как это foreach message in user_messages.messages.

Если я хочу добавить функции-члены в свою структуру, могу ли я изменить свое объявление и "продвинуть" его в класс, добавить функции и все-таки перебрать мои user_messages.messages, как и раньше?

Очевидно, что я все еще новичок, и я все еще не понимаю, как структуры и классы взаимодействуют друг с другом, какая практическая разница между ними и каковы правила наследования...

Ответ 1

Да, struct может наследовать от класса в С++.

В С++ классы и структура одинаковы, за исключением поведения по умолчанию в отношении уровней наследования и доступа членов.

Класс С++

  • Default Inheritance = private
  • Уровень доступа по умолчанию для переменных-членов и функций = частный

С++ struct

  • Default Inheritance = public
  • Уровень доступа по умолчанию для переменных-членов и функций = общедоступный

Ответ 2

В С++

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

эквивалентно:

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

и

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

эквивалентно:

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

Это означает, что члены struct/class по умолчанию являются общедоступными/частными.

Использование 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 { };

Сводка: Да, a struct может наследовать от класса. Разница между ключевыми словами class и struct - это просто изменение спецификаций private/public по умолчанию.

Ответ 3

Единственное различие между структурой и классом - это уровень доступа по умолчанию для членов (закрытый для классов, public для structs). Это означает, что структура должна унаследовать от класса и наоборот.

Однако обычно существует разница в том, как используются структуры и классы, которые не соответствуют стандарту. структуры часто используются для чистых данных (или объектов без полиморфизма в зависимости от предпочтений ваших проектов), а классы используются для других случаев. Я подчеркиваю, что это просто стилистическая разница и не требуется.

Ответ 4

Главное понять, что structs исходит от C, тогда как классы С++. Это означает, что хотя структуры являются первоклассными объектно ориентированными гражданами, они также имеют унаследованную цель, что является причиной того, что классы являются отдельными, а структуры - общедоступными по умолчанию. Однако, как только это будет сделано, они абсолютно и полностью идентичны и взаимозаменяемы во всех отношениях.

Ответ 5

Структура - это то же самое, что и класс, за исключением того, что класс по умолчанию ставит своих членов в private, а структура по умолчанию ставит своих членов на публичные. В результате, да, вы можете наследовать между ними. См. в С++, могу ли я получить класс из структуры.

Ответ 6

Структура и класс в значительной степени взаимозаменяемы - только с разными значениями по умолчанию в этих классах по умолчанию используются частные наследования и члены, а структуры - общедоступные. Ключевое слово (а не struct) должно использоваться, например. "template < class T > ".

Тем не менее, многие программисты используют эти два предложения, чтобы дать небольшое предложение программисту, читающему код: используя структуру, вы тонко предлагаете менее инкапсулирующий, OO-дизайн. Структура может быть использована внутри библиотеки, где получение в кишках всего этого является честной игрой, тогда как классы используются на границе, где изменения API будут неудобно клиентам, и лучшая абстракция полезна. Эта очень свободная конвенция выросла из-за разницы в доступности по умолчанию - ленивые/эффективные/сжатые (возьмите ваш выбор), программисты делают то, что проще всего, если только в этом нет никакой выгоды, а не набирать спецификаторы доступа, когда это возможно.

Ответ 7

Да. Struct может наследовать класс и наоборот. Правило доступности

$11.2/2- "В отсутствие спецификатор доступа для базового класса, общественность предполагается, когда производные класс объявляется struct и private предполагается, когда класс объявлен класс".

ИЗМЕНИТЬ 2: Таким образом, вы можете изменить свой класс как:. Обратите внимание, что это идея bad имеет обычно публичные члены данных.

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

Ответ 8

Да a struct может наследовать от класса. struct и class отличаются только спецификатором доступа, принятым для членов, и для базовых классов (или структур), если они явно не указаны на С++. Для структур это public. Для классов это private.

Предложение, которое вы цитируете в руководстве, относится к концепции класса в С++ по сравнению с концепцией структуры данных в C. В С++ было введено новое ключевое слово - class, чтобы лучше отразить изменение концепции, но для совместимости с кодом в C осталось прежнее ключевое слово struct, и оно имеет значение, как описано выше.

Ответ 9

Класс не будет публично наследоваться от структуры. Структура будет публично наследоваться от класса или структуры.

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 НЕ доступен