Frage

Ich las auf dem versiegelten Schlüsselwort in C #. Ich kann nicht das letzte Mal, dass ich von einer Standardbibliothek erben erinnern. In c ++ Ich erinnere mich erben eine std Schnittstelle, die ein paar Typen typedef und verwendet einige meiner Parameter. Aber das ist 1) Trivial 2) Eine Schnittstelle

Von der Spitze von meinem Kopf, ich dont jede Klasse erinnern, dass ich, dass nur knapp sein Ziel geerbt hat eine virtuelle Funktion geerbt zu erwarten. Kann mir jemand von einer Situation sagen, wo Sie eine nicht triviale Klasse erben benötigt, die eine Schnittstelle war nicht?

Ich könnte sagen, dass es auch eine gute Regel Daumen nicht um eine Klasse zu erben, wenn sie virtuelle Funktionen. Ist das eine gute Faustregel gilt:?

Hinweis: Ich benutze Operator Someclass & Someclass () {m_someClass zurückkehren; } Im Fall muss ich meine Aufgabe als eine andere Klasse zu übergeben. Es funktioniert gut.

War es hilfreich?

Lösung

Es ist tatsächlich in C ++ verwendet, für alle diese nicht-ist-eine Art der Vererbung (zB. Eine Implementierung vererben, Mixins boost :: noncopyable, wo Sie es erben und Ihre Klasse noncopyable machen, boost :: Betreiber wo man von einer Klasse erbt, und es wird einige Betreiber Ihre Klasse) hinzuzufügen. Auch wenn Metaprogrammierung mit C ++ Typen zu tun, erben von einer anderen Art (en) ist eine der einfachsten Methoden des Komponierens Typen.

Ein weiterer Fall, in dem Sie von einer Klasse erben, die nicht virtuelle Funktionen verfügen, sondern dienen als „Art“ einer Schnittstelle, sind statischer Polymorphismus (Techniken wie CRTP, wo Klasse ConcreteA: BaseA). Sie haben nicht die virtuellen Funktionen benötigen, weil alles zur Compile-Zeit aufgelöst wird.

Wenn Sie jedoch Ihre Klasse Runtime-polymorph behandeln wollen, sollten Sie wirklich mindestens eine Methode virtuell machen, und das wäre das destructor sein. Es gibt Ausnahmen, aber selten.

Auch wenn Sie eine polymorphe Hierarchie haben, Sie leiten manchmal von konkreten Klassen. Ein Beispiel wäre ein SingleLineEdit von TextEdit abzuleiten. Dies ist jedoch ein wenig gefährlich, weil es Verkapselung der Elternklasse bricht (zB seine Methoden können einige Details der Implementierung erwarten, und Sie müssen sie in der Unterklasse respektieren und bewahren -., Die schwierig sein kann, da sie Implementierungsdetails sind das kann Änderungen ohne vorherige Ankündigung in der nächsten Version usw.)

Andere Tipps

Ich würde behaupten, dass das Schlüsselkonzept der objektorientierten Programmierung ist Polymorphismus. Wenn von einer bestimmten Klasse zu erben Sie die Vorteile von Polymorphismus zu nehmen nicht erlaubt, was ist dann der Punkt vererben? Also, wenn es keine Methoden sind außer Kraft zu setzen, dann Unterklasse nicht. Sie würden nur die Komplexität des Codes zuzunehmen. Wenn Sie eine Menge von der gleichen Funktionalität wollen, wickeln Sie einfach die vorhandene Klasse in Ihrem eigenen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top