multiple-inheritance

___ qstntxt ___

Ich verstehe das Konzept der virtuellen Vererbung, aber ich konnte die Antwort nirgends finden. Nehmen wir an, Sie haben Klasse D, die Klasse B und C erbt. Sowohl B als auch C erben Klasse A. Sie könnten also B und C virtuell A erben lassen, um zwei Instanzen von A zu vermeiden. Aber müssen Sie virtuelle Vererbung an B und C angeben oder erstellt es bereits nur eine Instanz von A, wenn eine der beiden virtuell A übernimmt und die andere nicht?

Danke

    
___ answer13752638 ___

Sie müssen die virtuelle Vererbung für B und C angeben, um ein A zu erhalten. Andernfalls "teilt" die Klasse, die keine virtuelle Vererbung verwendet, die Klasse A.

Dies kann einem ermöglichen, Folgendes zu haben:

Warum Sie das tun wollen, ist eine andere Sache.

    
___ qstnhdr ___ Virtuelle Vererbung, eine Klasse genug? ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123multipherinitance ___ Ein Merkmal einiger objektorientierter Computerprogrammiersprachen, in denen eine Klasse Verhaltensweisen und Merkmale von mehr als einer Oberklasse oder Basisklasse erben kann. ___ tag123virtualinheritance ___ Die virtuelle Vererbung wird verwendet, um das Problem der gefürchteten Diamanten zu lösen, das mit der Mehrfachvererbung in C ++ verbunden ist. ___ answer13752551 ___

Sie müssen alle %code% sein. Aus C ++ 11 10.1 [class.mi] / 7:

Eine Klasse kann sowohl virtuelle als auch nicht-virtuelle Basisklassen eines bestimmten Typs haben.

%Vor%

Für ein Objekt der Klasse %code% entsprechen alle virtuellen Vorkommen der Basisklasse %code% im Klassengitter von %code% einem einzelnen Unterobjekt %code% im Objekt vom Typ %code% und jedem anderen Vorkommen einer (nichtvirtuellen) Basisklasse %code% im Klassengitter von %code% entspricht eins zu eins mit einem eindeutigen %code% Unterobjekt innerhalb des Objekts vom Typ %code% . Bei der oben definierten Klasse %code% hat die Klasse %code% zwei Unterobjekte der Klasse %code% : %code% s %code% und die virtuelle %code% gemeinsam von %code% und %code% , wie unten gezeigt.

    
___
1
Antwort

Speicherlayout einer Klasse unter multipler oder virtueller Vererbung und der vtable (s)?

Ich lese "Innerhalb des C ++ Objektmodells" und versuche zu verstehen, wie multiple und virtuelle Vererbung über die vtables erreicht wird (ich verstehe einzelnen Polymorphismus perfekt - gut). Ich habe Schwierigkeiten zu verstehen, was genau...
14.02.2015, 22:58
5
Antworten

C ++ Zeiger Multi-Vererbung Spaß

Ich schreibe Code, der die Vererbung von einer grundlegenden ref-zählenden Pointer-Klasse betrifft; und einige Feinheiten von C ++ tauchte auf. Ich habe es wie folgt reduziert: Angenommen, ich habe: %Vor% Darüber hinaus: %Vor% Danke!...
28.01.2010, 18:58
5
Antworten

Python - dynamische Mehrfachvererbung

Ich suche Ratschläge zum Design meines Codes. Einführung Ich habe mehrere Klassen, jede repräsentiert einen Dateityp, zB: MediaImageFile, MediaAudioFile und generische (und auch Basisklasse) MediaGenericFile. Jede Datei hat zwei Variant...
21.07.2012, 11:03
6
Antworten

Implementieren von Schnittstellen in C ++

Ich programmiere normalerweise in C #, versuche aber ein bisschen C ++ zu machen und versuche etwas, Schnittstellen in C ++ zu implementieren. In C # würde ich so etwas tun: %Vor% In C ++ habe ich es so implementiert: %Vor% Das Proble...
03.01.2012, 16:50
2
Antworten

Erweiterung von T und SomeInterfaceT in Java

Ich möchte eine Klasse erstellen, die zwei Parameter akzeptiert. Einer sollte einfach als T eingegeben werden. Der andere sollte als etwas eingegeben werden, das sowohl T als auch SomeInterface<T> erweitert. Wenn ich das versuche mit...
30.03.2010, 07:46
1
Antwort

Generics Funktionsaufruf nicht kompilieren in Java 8 Erweiterung mehrerer Schnittstellen

Ausführen von Java 1.8 JavaSE-1.8 (jdk1.8.0_20) Diese Klasse: %Vor% gibt den Kompilierfehler: Die Methode DoNothing () im Typ SimpleQuestion ist nicht anwendbar für die Argumente () Warum das und nicht DoNothing2,3 und 4?     
03.10.2014, 21:01
1
Antwort

Warum ist dieser qualifizierte Name bei Mehrfachvererbung mehrdeutig?

Ich versuche auf die Elementvariable x in struct Anfang zuzugreifen, indem ich ein Bottom -Objekt verwende. Der Code ist der folgende: %Vor% Dies gibt den folgenden Fehler mit gcc 4.8: %Vor% Wie ist das mehrdeutig und wie kann i...
20.09.2014, 19:46
2
Antworten

Wie funktioniert eine Super-Methode in Python bei Mehrfachvererbung?

Wie funktioniert eine Super-Methode in Python? Im angegebenen Code: %Vor% Wenn test auf D aufgerufen wird, gibt es B->C statt B->A aus (was ich erwartet habe). Wie verhält sich Super innerhalb B zu einer Instanz von C?...
05.04.2014, 10:09
1
Antwort

Keine Zugriffs- oder Mehrdeutigkeitsprüfung für die Funktion "Template-Member" in mehreren Basisklassen

Dies kompiliert und läuft gut auf Visual C ++ 2015 Update 3 RC: %Vor% Es gibt zwei Probleme mit diesem Code: f() ist privat, daher kann d.f<int>() nicht kompiliert werden. f() ist mehrdeutig, da es B::f() oder C::f...
11.06.2016, 18:14
1
Antwort

vtable: zugrunde liegender Algorithmus

Mein Verständnis von vtables ist, dass es, wenn ich eine Klasse Cat mit einer virtuellen Funktion speak () mit den Unterklassen Lion und HouseCat habe, eine vtable gibt, die speak () der korrekten Implementierung für jede Subklasse zuordnet. Als...
17.04.2017, 11:02