2012-04-14 11 views
0

Ich bin derzeit versuchen, das Konzept der multiplen virtuellen/nicht-virtuellen Vererbung in C++ zu begreifen. Wenn ich richtig verstehe, wenn eine Klasse B und C virtuell von Klasse A erben, teilen sie eine Art Singleton-Objekt, d. h. beide greifen auf gleiche Felder eines gemeinsamen Objekts A zu. Mehrfache Vererbung würde separate A-Objekte für jedes B- und C-Objekt erzeugen.virtuelle vs nicht-virtuelle Mehrfachvererbung in C++

Unter Berücksichtigung, würde jemand so freundlich sein und es in einem einfachen, praktischen Kontext präsentieren? Warum Vererbung an erster Stelle multiplizieren und warum dann virtuell/nicht-virtuell?

Danke.

+0

Was haben Sie über C++ - Programmierung gelesen? Mehrfache oder virtuelle Vererbung ist schwierig und sollte sehr oft vermieden werden. Und das Problem ist, dass eine Klasse D von B und C erbt. –

+0

Nun, ich studiere es jetzt, ich hatte nur eine grundlegende Einführung. Ich wäre definitiv besser dran, wenn jemand ein einfaches Beispiel dafür geben könnte, warum man das eine oder das andere benutzt. Ich brauche keine komplizierten Fälle. nur einfache, typische Szenarien wären perfekt, in einem Satz. – Bober02

+0

Ich muss sehr selten Mehrfachvererbung oder virtuelle Vererbung verwenden. Eine gute Regel ist, sie niemals zu benutzen. –

Antwort

4

Mehrfache Vererbung ist nicht oft used in C++. In den meisten Fällen handelt es sich um eine Mischung aus Interface/Implementierung. Es ist auch nicht verboten. Die Notwendigkeit einer (virtuelle) Mehrfachvererbung kommt von Design-Entscheidungen von einer allgemeinen Basisklasse ableiten:

class Window 
{ /* draw, show, hide, background ... */ }; 

class WindowWithBorder : public virtual Window 
{ /* methods to manipulate/draw border ... */ }; 

class WindowWithMenu : public virtual Window 
{ /* methods to manipulate/draw Menu ... */ }; 

class MyWindow : public WindowWithBorder, public WindowWithMenu 
{ /* now it's your turn ... */ }; 

Diese rautenförmigen Vererbungsgraphen müssen von der Bibliothek Implementierer vorgesehen werden. Ohne virtual gäbe es zwei Basis Window Objekte, mit virtual ist es nur eine, aber kein Singleton, da es viele Fenster geben kann.

Bibliotheken können oft (aber nicht in jedem Fall) avoid solche Situationen, z.B. durch Implementieren einer composite design pattern mit einer "fetten" Basisklasse durch Implementieren abstrakter Interface-Klassen oder durch Verwenden von Vorlagen mit Merkmalen/Richtlinien.

Ich würde empfehlen, das Kapitel über Klassenhierarchien in Bjarne Stroustrup The C++ Programming language zu lesen (ch. 15 in meiner 3. Ausgabe, ich lieh das Beispiel aus).