Unter Berücksichtigung dieser Objekte:
%Vor%Ich frage mich, warum - compiler-weise - das folgende Objekt als abstrakt betrachtet wird:
%Vor%Der Compiler lässt mich das nicht tun:
%Vor%Visual Studio 2010 sagt:
'C': kann die abstrakte Klasse aufgrund folgender Elemente nicht instanziieren: 'void A :: foo (void)': ist abstrakt: siehe Deklaration von 'A :: foo'
g ++ 4.6.3 sagt:
kann kein Objekt vom abstrakten Typ 'C' zuordnen, da die folgenden virtuellen Funktionen in 'C' rein sind: virtual void A :: foo ()
Ich denke, das ist in C # erlaubt, aber ich kenne die beteiligten Mechanismen nicht - ich bin nur neugierig.
struct B
implementiert eine Funktion, die zufällig foo
heißt und keine Argumente annimmt. Diese Funktion hat offensichtlich absolut keine Beziehung zu A::foo
. Wenn also struct C
sowohl von A
als auch von B
stammt, hat es geerbt:
A::foo
bereitzustellen
B::foo
, die denselben Namen und dieselbe Signatur wie A::foo
hat, aber in keiner Weise damit in Beziehung steht Ich denke, das Problem ist offensichtlich. Sie versuchen, A
als Äquivalent zu einem C # interface
zu verwenden, aber es gibt keine Möglichkeit, dieses Konzept in C ++ auszudrücken.
Jetzt hilft auch die using
Direktive nicht, da sie B::foo
nur in den Bereich von C
bringt, was bedeutet, dass sie dem Compiler sagt, dass sie B::foo
als einen Kandidaten für die Auflösung des Namens betrachten sollte foo
, wenn letzterer in der Klasse C
angetroffen wird. Leider hat das auch nichts mit der Verantwortung zu tun, rein virtuelle Methoden zu implementieren.
Leider tut das nicht ganz, was Sie wollen.
Eine using
-Direktive bringt nur einige Namen in den Bereich, in dem sie verwendet wird. virtual
Methoden müssen überschrieben werden, und nur Namen werden nicht als überschreibend betrachtet.
Die Wahrheit ist, dass C ++ delegation nicht direkt unterstützt. Es gibt nur diesen kleinen Unterschied, Namen explizit in den Geltungsbereich zu bringen.
Um dieses Problem zu lösen, müssen Sie Ihr eigenes foo()
in C implementieren und explizit die B-Funktion aufrufen, um A :: foo innerhalb von C:
Es macht auf einer bestimmten Ebene Sinn - es gibt keine inhärente Beziehung zwischen A :: foo () und B :: foo () - Sie müssen innerhalb von C explizit eine festlegen.
Ich denke, das ist in C # erlaubt
C ++ ist nicht C #.
virtual void foo()
und void foo()
sind zwei verschiedene Methoden.
Wenn Sie von A und B ableiten, erhalten Sie Zugriff auf zwei Methoden: virtual A::foo
und nicht-virtuelles B::foo
. Und virtual A::foo
ist abstrakt. Daher der Compilerfehler.
Tags und Links c++ multiple-inheritance