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?
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
:
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.
Tags und Links c++ inheritance multiple-inheritance diamond-problem