2009-02-23 6 views
25

Die Frage sagt alles wirklich. Darf ich eine Klasse von einer Struktur ableiten, oder sollte ich eine Klasse erstellen, die meine Struktur einbettet und Kopierkonstruktoren und einen = Operator definiert, um zwischen den beiden zu wechseln?in C++, kann ich eine Klasse von einer Struktur ableiten

+0

Die MFC-Klasse CRect erbt von struct tagRECT, AFAICS. – Constantin

+0

Mein schlechter Text der Frage geändert. –

Antwort

33

In C++ struct ist (fast) auch ein class (mit Ausnahme von anderen Standard-Zugriffsebene), also ja, können Sie.

Ich bin nicht vertraut mit MFC, aber es sieht aus wie ein Versuch, sowohl C und C++ APIs zu erhalten.

+0

Danke dafür. Ich war mir ziemlich sicher, dass es in Ordnung war, aber ich habe es nie wirklich in der Praxis gesehen. –

9

Natürlich sind Sie. Was bei der Vererbung anders ist, ist, dass wenn Sie eine Klasse definieren, sie private von anderen Klassen/Strukturen erbt. Wenn Sie eine Struktur und leiten sie von einer Klasse oder Struktur definieren, wird es eine öffentliche Vererbung von Standard sein:

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

Wenn Sie fragen, wie Sie C structs wickeln sollte - ich sie als Mitglied in die Klasse einbinden würde . Da die C-Strukturen nicht entworfen wurden, um geerbt zu werden (denken Sie an den weder geschützten noch virtuellen Destruktor in den C-Strukturen - sie können keinen haben). Sie sind einfache Aggregate, die Daten sammeln. Und wenn man sie als Mitglieder verwendet, benutzt man sie als solche (wie in "ein Punkt hat ein Paar von x- und y-Koordinaten").

C-Strukturen offenbaren auch Elemente, die möglicherweise in der Klasse nicht ausgesetzt werden sollten. Containment ermöglicht eine genaue Kontrolle darüber, was exposed und was nicht von get/set-Funktionen ist, und Sie können trotzdem eine Kopie oder Referenz auf das enthaltene nackte C struct-Objekt erhalten.

7

Ja. Sie können eine Klasse von einer Struktur ableiten. In C++ ist eine Struktur einfach eine Klasse, in der der Standardzugriff öffentlich und nicht privat ist. Das Ableiten einer Klasse aus einer Struktur, die nur nichtvirtuelle Elementfunktionen und/oder statische Funktionen hinzufügt, ist eine nützliche Technik, um eine C++ - Schnittstelle bereitzustellen, während die Kompatibilität mit einer C-Stil-API beibehalten wird.

Dies ist genau der Ansatz von MFC für viele der C-Strukturen verwendet (im Gegensatz zu dem, was Sie in Ihrer Frage angeben).

Zum Beispiel wird die Klasse CRect öffentlich von struct tagRECT abgeleitet (der häufiger verwendete Name RECT ist ein typededf für struct tagRECT). Da struct tagRECT alle Datenelemente definiert und CRect nur nicht virtuelle Memberfunktionen hinzufügt, ist das Speicherlayout von CRects und RECTs identisch. Sie können ein CRect als Argument für jede Funktion verwenden, die für ein RECT erwartet wird, und umgekehrt.