La question dit tout vraiment. Suis-je autorisé à dériver une classe d'une structure, ou dois-je créer une classe qui incorpore ma structure et définit les constructeurs de copie et un opérateur = pour se déplacer entre les deux?en C++, puis-je dériver une classe à partir d'une structure
Répondre
En C++ struct
est (presque) aussi un class
(à l'exception du niveau d'accès par défaut différent), donc oui, vous pouvez.
struct A {
// fields are public by default
};
class B: public A {
// fields are private by default
};
Je ne suis pas familier avec MFC, mais il ressemble à une tentative de maintenir à la fois C et C++ API.
Merci pour cela. J'étais à peu près sûr que ça allait, mais je ne l'avais jamais vu en pratique. –
Bien sûr que vous l'êtes. Ce qui est différent en ce qui concerne l'héritage, c'est que si vous définissez une classe, elle héritera de private d'autres classes/structs. Si vous définissez un struct et dériver d'une classe ou struct, ce sera un héritage public par défaut:
// the following two are equivalent except that one time class is
// used and the other time struct
struct f : g { };
class f : public g { };
Si vous vous demandez comment vous devez envelopper C struct - je les intégrer en tant que membre dans la classe . Parce que les structures C n'étaient pas conçues pour être héritées (pensez au destructeur ni protégé ni virtuel dans les structures C - elles ne peuvent pas en avoir un). Ce sont des agrégats simples qui collectent des données. Et les mettre en tant que membres les utilise comme tels (comme dans "un point a une paire de coordonnées x et y").
Les structures en C exposent également les membres qui ne devraient éventuellement pas être exposés dans la classe. Le confinement permet un contrôle précis sur ce qui est exposé et ce qui ne l'est pas par les fonctions get/set et vous pouvez toujours le laisser vous donner une copie ou une référence à l'objet struct struct N nu contenu.
Oui. vous pouvez dériver une classe à partir d'une structure. 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 ajoute uniquement des fonctions membres non-virales et/ou des fonctions statiques est une technique utile pour fournir une interface C++ tout en maintenant la compatibilité avec une API de style C.
C'est exactement l'approche utilisée par MFC pour de nombreuses structures C (contrairement à ce que vous dites dans votre question).
Par exemple, la classe CRect est dérivée publiquement de struct tagRECT (le nom plus communément utilisé RECT est typededf pour struct tagRECT). Comme struct tagRECT définit tous les membres de données et que CRect ajoute uniquement des fonctions de membre non virtuelles, la disposition de mémoire des CRects et des RECT est identique. Vous pouvez utiliser un CRect comme argument pour toute fonction attendue RECT et vice versa.
- 1. Comment dériver une classe à partir de CFindReplaceDialog? (MFC)
- 2. Comment dériver une nouvelle classe à partir de DataTemplate et l'utiliser à la place de DataTemplate?
- 3. Dériver une classe avec des membres privés
- 4. dériver problème sur C++
- 5. JavaScript orienté objet - Comment définir une classe dans une classe? à partir d'un exemple C#
- 6. Databinding à une classe personnalisée en C#
- 7. Structure de classe protégée en Java?
- 8. Sérialiser une structure en C# vers C++ et vice versa
- 9. en utilisant un const statique dans une structure/classe
- 10. Donner une instance d'une classe un pointeur à une structure
- 11. Structure Generics en C#
- 12. Comment déclarer une structure dans une classe?
- 13. Structure problème en C
- 14. Comment dériver un chemin relatif en utilisant Ant
- 15. C# .NET Convertir une image JPEG en une structure Bitmap
- 16. Accès à la mémoire de classe publique à partir de C++ en utilisant C
- 17. Héritage de structure en C++
- 18. Accès aux membres de la structure Win32 C/C++ à partir du C#
- 19. Itérer à travers une structure?
- 20. En passant une structure non géré C++ par référence à une méthode gérée C++ provoque une violation d'accès lorsque la structure est référencée
- 21. C++ comment appeler une méthode de classe parente à partir d'une classe contenue?
- 22. Comment créer une instance à partir d'une chaîne en C#?
- 23. Sérialisation en C# avec une classe dérivée
- 24. C#: Pointeur vers la structure à l'intérieur de la structure
- 25. Comment se référer à une "classe propriétaire" en C++?
- 26. Comment accéder à une minuterie d'une autre classe en C#
- 27. Classe non enregistrée .... lorsque j'essaie d'appeler une bibliothèque C# gérée à partir d'un C++ non géré
- 28. structure en C- pour ajouter un attribut à l'exécution?
- 29. Écrire une structure de longueur variable C# en binaire et la lire en C++?
- 30. Obtenir un pointeur à la structure dans une carte C++
La classe CRect de MFC hérite de struct tagRECT, AFAICS. – Constantin
Mon mauvais texte de la question a changé. –