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


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

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

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

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

Я думаю, что в таком случае struct B наследует от всех данных в stuct 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.сообщения, как я делал раньше?

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

9 55

9 ответов:

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

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

C++ - класс

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

C++ структуры

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

В C++

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

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

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

и

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

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

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

это означает, что члены структуры/класса по умолчанию public / private.

используя 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 для структур). Это означает, что структура должна иметь возможность наследовать от класса, и наоборот.

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

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

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

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

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

предложение, которое вы цитируете из руководства, касается концепции класса В C++, по сравнению с концепцией структуры данных в C. В C++ новое ключевое слово -class был введен, чтобы лучше отразить изменение в концепции, но для совместимости с кодом в C, старое ключевое слово 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;  
};

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

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

B b; b.a=5; //OK. в доступном

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

это означает то же самое. B b; b.a=5; //OK. в доступном

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; //OK. в доступном

и наконец:

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; / / не ок. не работает