C ++: Может ли структура наследовать от класса? - PullRequest
60 голосов
/ 26 августа 2010

Я смотрю на реализацию 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, как я делал раньше?

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

Ответы [ 9 ]

102 голосов
/ 26 августа 2010

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

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

класс C ++

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

C ++ struct

  • Наследование по умолчанию = public
  • Уровень доступа по умолчанию для переменных и функций-членов = публично
37 голосов
/ 26 августа 2010

В 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 может наследоваться от класса.Разница между ключевыми словами class и struct заключается только в изменении частных / открытых спецификаторов по умолчанию.

7 голосов
/ 26 августа 2010

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

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

6 голосов
/ 26 августа 2010

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

5 голосов
/ 26 августа 2010

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

4 голосов
/ 26 августа 2010

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

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

4 голосов
/ 26 августа 2010

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

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

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

class user_messages {  // i also changed the name when OP was modified :)
public:   
   std::list<std::string> messages;  
};
4 голосов
/ 26 августа 2010

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

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

1 голос
/ 18 ноября 2015

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

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

B b; b.a = 5; //ХОРОШО. А доступен

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

Это означает то же самое. B b; b.a = 5; //ХОРОШО. А доступен

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

B b; b.a = 5; //НЕ ХОРОШО. А НЕ доступен

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

B b; b.a = 5; //ХОРОШО. А доступен

Наконец:

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

B b; b.a = 5; //НЕ ХОРОШО. а не доступен

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

B b; b.a = 5; //НЕ ХОРОШО. а не доступен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...