Verstecke die virtuelle Funktion mit nicht-virtueller Überschreibung

8

Haben

%Vor%

Die Ausgabe ist C , aber ich habe B erwartet.

Ich habe B::foo() nicht mit dem Modifizierer virtual deklariert, daher erwarte ich, dass der Funktionsaufruf vom statischen Typ bestimmt wird (kein Polymorphismus).

Warum wird C::foo() aufgerufen?

Ist es möglich, eine nicht-virtuelle Funktion in einer abgeleiteten Klasse zur Verfügung zu stellen, die die virtuelle Funktion in der Basis versteckt? Welche Signatur sollte die abgeleitete Elementfunktion haben, damit b->foo() sie aufruft und nicht (b->*&A::foo)()

?     
sk1ll3r 18.06.2014, 12:55
quelle

1 Antwort

2

Das Prinzip der virtuellen Vererbung einer Memberfunktion ist eine direkte Konsequenz des C ++ Standards:

  

10.3 / 2: Wenn eine virtuelle Member-Funktion vf in einer Klasse Base und in einer Klasse Derived deklariert ist, direkt oder indirekt abgeleitet von Base ,   eine Memberfunktion vf mit dem gleichen Namen, Parametertypliste,   cv-qualification und refqualifier (oder das Fehlen derselben) wie Base :: vf ist   deklariert, dann ist Derived :: vf auch virtuell .

Also unabhängig von der Vererbungsebene wird die Funktion in allen von A abgeleiteten Klassen virtuell sein. Es ist nicht nötig, das Schlüsselwort virtual zu setzen.

Das Ziel dieses polymorphen Ansatzes besteht darin, sicherzustellen, dass Sie immer die entsprechende Funktion aufrufen, die der tatsächlichen Identität Ihres Objekts entspricht, ungeachtet der Tatsache, dass Sie einen Zeiger auf eine Basis oder einen Zeiger auf die reale Klasse des Objekts verwenden. Deshalb erhalten Sie "C"!

In dies verwandt SO Frage Ich erkläre einen Trick, um den Eindruck zu erwecken, die Virtualität auf einer einzigen Ebene zu entfernen, indem Mehrfachvererbung verwendet wird. Es kann jedoch nur für eine einzelne Ebene durchgeführt werden (Sie sollten dies für die Klasse Ihres Basiszeigers tun).

* Übrigens könnten Sie pb->B::foo(); no need of *& schreiben.

    
Christophe 19.02.2015 23:39
quelle