2009-02-23 6 views

Répondre

33

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.

+0

Merci pour cela. J'étais à peu près sûr que ça allait, mais je ne l'avais jamais vu en pratique. –

9

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.

7

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.

Questions connexes