Je regarde l'implémentation d'une API que j'utilise.
J'ai remarqué qu'une structure hérite d'une classe et j'ai fait une pause pour y réfléchir ...
Tout d'abord, je n'ai pas vu dans le manuel C++ avec lequel j'ai étudié qu'une structure pouvait hériter d'une autre structure:
struct A {};
struct B : public A {};
Je suppose que dans un tel cas, la structure B hérite de toutes les données dans la structure A. Peut-on déclarer des membres publics/privés dans une structure?
Mais j'ai remarqué ceci:
class A {};
struct B : public A {};
De mon manuel C++ en ligne:
Une classe est un concept étendu d'une structure de données: au lieu de contenir uniquement des données, elle peut contenir les deux données et fonctions.
L'héritage ci-dessus est-il valide même si la classe A a des fonctions membres? Qu'arrive-t-il aux fonctions quand une structure en hérite? Et qu'en est-il de l'inverse: une classe héritant d'une structure?
En pratique, j'ai ceci:
struct user_messages {
std::list<std::string> messages;
};
Et j'avais l'habitude d'itérer dessus comme ça foreach message in user_messages.messages
.
Si je veux ajouter des fonctions membres à ma structure, puis-je changer sa déclaration et la "promouvoir" en classe, ajouter des fonctions et continuer à parcourir mes user_messages.messages comme je l'ai fait auparavant?
Évidemment, je suis toujours un débutant et je ne sais toujours pas comment les structures et les classes interagissent entre elles, quelle est la différence pratique entre les deux, et quelles sont les règles d'héritage ...
Oui, la structure peut hériter de la classe en C++.
En C++, les classes et struct sont les mêmes sauf pour leur comportement par défaut en ce qui concerne l'héritage et les niveaux d'accès des membres.
En C++
struct A { /* some fields/methods ... */ };
est équivalent à:
class A { public: /* some fields/methods ... */ };
Et
class A { /* some fields/methods ... */ };
est équivalent à:
struct A { private: /* some fields/methods ... */ };
Cela signifie que les membres d'une structure/classe sont par défaut publics/privés .
L'utilisation de struct
aussi change l'héritage par défaut en public
, c'est-à-dire.
struct A { }; // or: class A { };
class B : A { };
est équivalent à
struct A { }; // or: class A { };
struct B : private A { };
Et l'inverse, ce
struct A { }; // or: class A { };
struct B : A { };
est équivalent à:
struct A { }; // or: class A { };
class B : public A { };
Résumé: Oui, un struct
peut hériter d'une classe. La différence entre les mots clés class
et struct
n'est qu'un changement dans les spécificateurs privé/public par défaut.
La seule différence entre une structure et une classe est le niveau d'accès par défaut pour les membres (privé pour les classes, public pour les structures). Cela signifie qu'une structure doit pouvoir hériter d'une classe, et vice-versa.
Cependant, il existe généralement une différence dans l'utilisation des structures et des classes qui n'est pas prescrite par la norme. les structures sont souvent utilisées pour des données pures (ou des objets sans polymorphisme selon la préférence de vos projets) et des classes sont utilisées pour les autres cas. J'insiste sur le fait qu'il ne s'agit que d'une différence stylistique et non requise.
La principale chose à comprendre est que les structures viennent de C, alors que les classes sont C++. Cela signifie que même si les structures SONT des citoyens orientés objet de première classe, elles ont également un objectif hérité, ce qui explique la séparation des classes et la structure des accès publics par défaut. Cependant, une fois cela fait, ils sont absolument et totalement identiques et interchangeables à tous égards.
Une structure est la même chose qu'une classe, sauf qu'une classe par défaut ses membres en privé tandis qu'une structure par défaut ses membres en public. En conséquence, oui, vous pouvez hériter entre les deux. Voir en C++, puis-je dériver une classe d'une structure .
struct et classe sont à peu près interchangeables - juste avec des valeurs par défaut différentes dans la mesure où les classes par défaut sont l'héritage privé et les membres, les structures sont publiques. Le mot-clé de classe (et non struct) doit être utilisé par exemple pour. "modèle <classe T>".
Cela dit, de nombreux programmeurs utilisent les deux pour donner une légère suggestion à un programmeur qui lit le code: en utilisant une structure, vous suggérez subtilement une conception moins encapsulante, OO. Une structure peut être utilisée interne à une bibliothèque - où aller à l'essentiel est un jeu équitable, tandis que les classes sont utilisées à la frontière où les changements d'API gêneraient les clients et une meilleure abstraction est utile. Cette convention très lâche est née de la différence d'accessibilité par défaut - les programmeurs paresseux/efficaces/concis (faites votre choix) font ce qui est le plus facile à moins qu'il y ait un avantage autrement, et ne pas taper les spécificateurs d'accès est bien quand c'est possible.
Oui. Les structures peuvent hériter d'une classe et vice versa. La règle d'accessibilité est
$ 11.2/2- "En l'absence d'un spécificateur d'accès pour une classe de base, public est supposé lorsque la classe dérivée est déclarée struct et private est supposé lorsque la classe est déclarée classe."
EDIT 2: Vous pouvez donc changer votre classe comme:. Notez que c'est une idée mauvaise d'avoir généralement des membres de données publiques.
class user_messages { // i also changed the name when OP was modified :)
public:
std::list<std::string> messages;
};
Oui, un struct
peut hériter d'une classe. struct
et class
ne diffèrent que par le spécificateur d'accès supposé pour les membres et les classes de base (ou structures) s'ils ne sont pas spécifiés explicitement en C++. Pour les structures, c'est public
. Pour les classes, c'est private
.
La phrase que vous citez du manuel concerne le concept d'une classe en C++, par rapport au concept d'une structure de données en C. En C++, un nouveau mot-clé - class
a été introduit pour mieux refléter le changement dans le concept , mais pour des raisons de compatibilité avec le code en C, un ancien mot clé struct
a été laissé et sa signification est celle décrite ci-dessus.
Une classe n'héritera pas publiquement d'une structure. Une structure héritera publiquement d'une classe ou d'une structure.
class A
{
public:
int a;
};
struct B : A
{};
B b; b.a = 5; //D'ACCORD. a est accessible
class A
{
public:
int a;
};
struct B : public A
{};
Cela veut dire la même chose. B b; b.a = 5; //D'ACCORD. a est accessible
struct A
{int a;};
class B : A
{};
B b; b.a = 5; //PAS D'ACCORD. a n'est PAS accessible
struct A
{int a;};
class B : public A
{};
B b; b.a = 5; //D'ACCORD. a est accessible
Finalement:
class A
{int a;};
class B : A
{};
B b; b.a = 5; //PAS D'ACCORD. a n'est PAS accessible
class A
{int a;};
class B : public A
{};
B b; b.a = 5; //PAS D'ACCORD. a n'est PAS accessible