2009-02-23 8 views
25

La domanda dice tutto davvero. Mi è permesso ricavare una classe da una struct, o dovrei creare una classe che incorpori la mia struct e definisca i costruttori di copia e l'operatore an = per spostarsi tra i due?in C++, posso ricavare una classe da una struct

+0

Il codice classe MFC eredita dal tag struct RECT, AFAICS. – Constantin

+0

Il mio male - il testo della domanda è cambiato. –

risposta

33

In C++ struct è (quasi) un class (ad eccezione del diverso livello di accesso predefinito), quindi sì, è possibile.

struct A { 
// fields are public by default 
}; 

class B: public A { 
// fields are private by default 
}; 

Non ho familiarità con MFC, ma sembra che un tentativo di mantenere sia C e le API C++.

+0

Grazie per quello. Ero abbastanza sicuro che fosse ok, ma non l'avevo mai visto in pratica. –

9

Certo che lo sei. Ciò che è diverso per quanto riguarda l'ereditarietà è che se si definisce una classe, essa erediterà private da altre classi/strutture. Se si definisce una struct e derivi da una classe o struct, sarà un'eredità pubbliche per impostazione predefinita:

// the following two are equivalent except that one time class is 
// used and the other time struct 
struct f : g { }; 
class f : public g { }; 

Se vi domandate come si dovrebbe avvolgere le strutture C - io li incorporare come membro nella classe . Perché le strutture C non sono state progettate per essere ereditate da (si pensi al distruttore non protetto né virtuale nelle strutture C - non possono averne uno). Sono semplici aggregati che raccolgono dati. E metterli come membri li usa come tali (come in "un punto ha una coppia di xe una coordinata y").

Le strutture C espongono anche membri che probabilmente non dovrebbero essere esposti nella classe. Il contenimento consente un controllo preciso su ciò che è esposto e ciò che non avviene con le funzioni get/set e si può ancora lasciargli dare una copia o un riferimento all'oggetto C struct nudo contenuto.

7

Sì. puoi ricavare una classe da una struttura. In C++, una struct è semplicemente una classe in cui l'accesso predefinito è pubblico piuttosto che privato. Derivare una classe da una struttura che aggiunge solo funzioni membro non virali e/o funzioni statiche è una tecnica utile per fornire un'interfaccia C++ mantenendo la compatibilità con un'API in stile C.

Questo è esattamente l'approccio utilizzato da MFC per molte delle strutture C (contrariamente a quanto dichiarato nella domanda).

Ad esempio, la classe CRect è pubblicamente derivata da struct tagRECT (il nome più comunemente usato RECT è un typededf per struct tagRECT). Poiché struct tagRECT definisce tutti i membri dei dati e CRect aggiunge solo funzioni membro non virtuali, il layout di memoria di CRects e RECT è identico: è possibile utilizzare un CRect come argomento per qualsiasi funzione prevista in RECT e viceversa.

Problemi correlati