2009-02-23 13 views
25

Pytanie to wszystko naprawdę. Czy mogę wyprowadzić klasę ze struktury, czy też powinienem stworzyć klasę, która osadza moją strukturę i definiuje konstruktorów kopii oraz operator =, aby poruszać się między tymi dwoma?w C++, czy mogę wyprowadzić klasę z struct

+0

Klasy MFC klasy CRect dziedziczą po struct tagRECT, AFAICS. – Constantin

+0

Mój zły - tekst pytania się zmienił. –

Odpowiedz

33

W języku C++ struct jest (prawie) równoznaczne z class (z wyjątkiem innego domyślnego poziomu dostępu), więc tak, można.

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

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

Nie jestem zaznajomiony z MFC, ale wygląda na to, że próbuję zachować API C i C++.

+0

Dzięki za to. Byłem prawie pewien, że było dobrze, ale nigdy nie widziałem tego w praktyce. –

9

Oczywiście, że tak. Różnica w dziedziczeniu polega na tym, że jeśli zdefiniujesz klasę, odziedziczy ona prywatne z innych klas/struktur. Jeśli definiować struct i wyprowadzić go z klasy lub struktury, będzie to dziedziczenie publiczne domyślnie:

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

Jeśli zastanawiasz się, jak należy owinąć struktur C - chciałbym umieścić je jako członka do klasy . Ponieważ struktury C nie zostały zaprojektowane do odziedziczenia (nie są to ani chronione, ani wirtualne destruktory w C-strukturach - nie mogą mieć jednego). Są to proste agregaty zbierające dane. I umieszczenie ich jako członków używa ich jako takich (jak w "punkcie ma parę współrzędnych xi y").

Struktury C także narażają członków, których być może nie powinno się ujawniać w klasie. Przechowywanie umożliwia precyzyjną kontrolę nad tym, co jest wyeksponowane, a co nie przez funkcje get/set, i nadal możesz dać mu kopię lub odwołanie do zawartego nagiego obiektu C struct.

7

Tak. możesz wyprowadzić klasę ze struktury. W C++, struct jest po prostu klasą, w której domyślny dostęp jest publiczny, a nie prywatny. Wyprowadzenie klasy ze struktury, która dodaje tylko niepowiązane funkcje członkowskie i/lub funkcje statyczne, jest przydatną techniką zapewnienia interfejsu C++ przy jednoczesnym zachowaniu zgodności z interfejsem API w stylu C.

To jest właśnie podejście stosowane przez MFC dla wielu struktur C (w przeciwieństwie do tego, co podajesz w swoim pytaniu).

Na przykład klasa CRect jest publicznie wyprowadzana z struct tagRECT (najczęściej używaną nazwą RECT jest typeded dla struct tagRECT). Ponieważ struct tagRECT definiuje wszystkie elementy danych, a CRect dodaje tylko nie-wirtualne funkcje składowe, układ pamięci CRect i RECT są identyczne - możesz użyć CRect jako argumentu dla dowolnej funkcji oczekiwanej RECT i na odwrót.