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

Я смотрю на реализацию API, которую я

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

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

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 в user_messages.messages .

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

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

64
задан augustin 26 August 2010 в 11:09
поделиться

7 ответов

Да, структура может наследоваться от класса в C++.

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

Класс C++

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

Структура C++

  • Наследование по умолчанию = public
  • Default Уровень доступа для переменных-членов и функций = public
106
ответ дан 24 November 2019 в 15:42
поделиться

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

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

38
ответ дан 24 November 2019 в 15:42
поделиться

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

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

4
ответ дан 24 November 2019 в 15:42
поделиться

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

5
ответ дан 24 November 2019 в 15:42
поделиться

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

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

РЕДАКТИРОВАТЬ 2: Таким образом, вы можете изменить свой класс как:. Обратите внимание, что обычно плохая идея иметь общедоступные элементы данных.

class user_messages {  // i also changed the name when OP was modified :)
public:   
   std::list<std::string> messages;  
};
4
ответ дан 24 November 2019 в 15:42
поделиться

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

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

4
ответ дан 24 November 2019 в 15:42
поделиться

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

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

7
ответ дан 24 November 2019 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: