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 ответов:
да, структура может наследовать от класса в 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; / / не ок. не работает