C ++ erbt von mehreren Basisklassen mit demselben virtuellen Funktionsnamen

8

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 ~~

    
watson 23.08.2013, 08:36
quelle

2 Antworten

16

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 Klasse Base deklariert ist und in einer Klasse Derived , abgeleitet direkt oder indirekt von Base , eine Memberfunktion vf mit demselben Namen, parameter-type-list , cv-qualification und ref-qualifier (oder das Fehlen derselben) wie Base::vf deklariert wird, dann ist Derived::vf auch virtuell (ob es so deklariert ist) und es < em> überschreibt Base::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:

%Vor%     
dyp 23.08.2013 10:48
quelle
4

Sie haben nur eine virtuelle Funktion foo :

%Vor%     
Paul Evans 23.08.2013 09:12
quelle