C ++ Mehrfachvererbung - warum Sie nicht arbeiten?

8

Ich versuche, ein interessantes Problem mit Mehrfachvererbung herauszufinden.

Das Großelternteil ist eine Interface-Klasse mit mehreren Methoden:

%Vor%

Dann gibt es abstrakte Klassen, die diese Schnittstelle teilweise vervollständigen.

%Vor%

Die Klasse, die ich verwenden möchte, erbt von beiden Eltern und gibt an, welche Methode von wo aus über Direktiven kommen soll:

%Vor%

Wenn ich versuche, ein D zu instanziieren, erhalte ich Fehler beim Versuch, eine abstrakte Klasse zu instantiieren.

%Vor%

Kann jemand mir helfen, das Problem zu verstehen und wie man partielle Implementierungen am besten nutzt?

    
Michael 03.05.2011, 02:27
quelle

2 Antworten

13

Sie haben keine Diamantenvererbung. Die B und C Basisklassen von D haben jeweils ihr eigenes Unterobjekt A , da sie nicht virtuell von A erben.

Also, in D gibt es wirklich vier reine virtuelle Memberfunktionen, die implementiert werden müssen: die A::foo und A::bar von B und die A::foo und A::bar von C .

Wahrscheinlich möchten Sie die virtuelle Vererbung verwenden. Die Klassendeklarationen und Basisklassenlisten würden so aussehen:

%Vor%

Wenn Sie die virtuelle Vererbung nicht verwenden möchten, müssen Sie die anderen zwei reinen virtuellen Funktionen in D :

überschreiben %Vor%     
James McNellis 03.05.2011, 02:31
quelle
-2

Sie müssen Ihre Basisklassen virtual erstellen, damit sie ordnungsgemäß erben. Die allgemeine Regel lautet, dass alle nicht privaten Member-Funktionen und Basisklassen virtual sein sollten, wenn Sie nicht wissen, was Sie tun, und die normale Vererbung für dieses Member / diese Basis deaktivieren möchten.

    
Chris Dodd 03.05.2011 02:37
quelle