en C++, je peux dériver une classe à partir d'une struct
La question, dit-il tout en fait. Ai-je le droit de dériver une classe à partir d'une structure, ou devrais-je créer une classe qui intègre mon struct et définit copie des constructeurs et un opérateur = pour se déplacer entre les deux?
- MFC classe CRect hérite de struct tagRECT, AFAICS.
- Mon mauvais - texte de la question changé.
Vous devez vous connecter pour publier un commentaire.
En C++
struct
(ou presque) est synonyme d'uneclass
(à l'exception de différents niveau d'accès par défaut), donc, oui, vous le pouvez.Je ne suis pas familier avec les MFC, mais cela ressemble à une tentative de maintenir à la fois le C et le C++ Api.
Bien sûr, vous êtes. Ce qui est différent au sujet de la succession, c'est que si vous définissez une classe, il héritera privée des autres classes et/ou des structures. Si vous définissez une structure et d'en dériver à partir d'une classe ou structure, il sera un patrimoine public par défaut:
Si vous vous demandez comment vous devez envelopper C structs - je les intégrer en tant que membre dans la classe. Parce que la C structures n'ont pas été conçus pour être hérité de (pensez à la ni protégés ni destructeur virtuel dans la C structures - ils ne peuvent pas avoir un). Ils sont de simples agrégats qui collectent les données. Et de les mettre en tant que membres les utilise en tant que tels (comme dans "un point a une paire de un x et un y de coordonnées").
C structs également exposer ses membres qui, éventuellement, ne doit pas être exposé à la classe. Le confinement permet un contrôle précis sur ce qui est exposé et ce n'est pas par get/fonctions de jeu et vous pouvez le laisser vous donner une copie ou d'une référence à l'contenues nu C struct objet.
Oui. vous pouvez dériver une classe à partir d'une struct. En C++, une structure est simplement une classe où l'accès par défaut est public plutôt que privé. Dériver une classe à partir d'une structure qui n'ajoute non-virual fonctions de membre et/ou des fonctions statiques est une technique utile pour fournir une interface C++, tout en conservant la compatibilité avec un style C API.
C'est exactement l'approche utilisée par les MFC pour beaucoup de la C structures (contrairement à ce que vous dites dans votre question).
Par exemple, la CRect classe est publiquement dérivé de struct tagRECT (le plus couramment utilisé nom RECT est un typededf pour struct tagRECT). Parce que struct tagRECT définit tous les membres de données, et de CRect ajoute que non-membre virtuel fonctions, la disposition de la mémoire de CRects et Rectangles sont identiques, vous pouvez utiliser un CRect comme un argument pour toute fonction attend un RECT et vice-versa.