Ich habe diesen Code ausprobiert:
%Vor%Bei Verwendung des kommentierten Teils ist es OK, aber wenn ich versuche, die Definitionen außerhalb der Klassendeklaration zu schreiben, meldet der Compiler Fehler. Ich benutze den MSVC11 Compiler, weiß jemand wie man das schreibt? Ich muss den Code in die cpp-Datei verschieben.
Danke ~~
Eine Funktion überschreibt eine virtuelle Funktion einer Basisklasse basierend auf den Namen und Parametertypen (siehe unten). Daher hat Ihre Klasse C
zwei virtuelle Funktionen foo
, eine geerbte von jedem A
und B
. Aber eine Funktion void C::foo()
überschreibt beide :
[klasse.virtual] / 2
Wenn eine virtuelle Memberfunktion
vf
in einer KlasseBase
deklariert ist und in einer KlasseDerived
, abgeleitet direkt oder indirekt vonBase
, eine Memberfunktionvf
mit demselben Namen, parameter-type-list , cv-qualification und ref-qualifier (oder das Fehlen derselben) wieBase::vf
deklariert wird, dann istDerived::vf
auch virtuell (ob es so deklariert ist) und es < em> überschreibtBase::vf
.
Wie bereits in den Kommentaren erwähnt, verbietet [dcl.meaning] / 1 die Verwendung einer qualifizierten ID in der Deklaration einer (Mitglieds-) Funktion:
Wenn die deklarator-ID qualifiziert ist, muss sich die Deklaration auf ein zuvor deklariertes Mitglied der Klasse oder des Namespaces beziehen, auf das der Qualifier [...] verweist "
Daher ist virtual void X::foo();
als Deklaration innerhalb von C
verboten.
Der Code
%Vor% ist das einzige Verfahren, mit dem AFAIK foo
überschreibt, und es überschreibt sowohl A::foo
als auch B::foo
. Es gibt keine Möglichkeit, zwei verschiedene Außerkraftsetzungen für A::foo
und B::foo
mit anderem Verhalten als durch Einführung einer anderen Vererbungsebene zu haben:
Tags und Links class c++ function multiple-inheritance virtual