Mehrfachvererbung macht das unwahr.
Das ist nicht ganz richtig. Betrachten Sie dieses Beispiel:
struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};
Beim Erstellen einer Instanz D
, B
und C
sind jeweils mit ihren jeweiligen Instanz instanziiert A
. Es wäre jedoch kein Problem, wenn die Instanz von D
dieselbe Adresse wie ihre Instanz B
und ihre jeweilige Instanz von hätte A
. Obwohl dies nicht erforderlich ist, geschieht genau dies beim Kompilieren mit clang 11
und gcc 10
:
D: 0x7fffe08b4758 // address of instance of D
B: 0x7fffe08b4758 and A: 0x7fffe08b4758 // same address for B and A
C: 0x7fffe08b4760 and A: 0x7fffe08b4760 // other address for C and A
Macht die virtuelle Vererbung das auch unwahr?
Betrachten wir eine modifizierte Version des obigen Beispiels:
struct A {};
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};
Die Verwendung des virtual
Funktionsbezeichners wird normalerweise verwendet, um mehrdeutige Funktionsaufrufe zu vermeiden. Daher müssen bei Verwendung der virtual
Vererbung sowohl B
als auch C
Instanzen eine gemeinsame A
Instanz erstellen . Beim Instanziieren erhalten D
wir folgende Adressen:
D: 0x7ffc164eefd0
B: 0x7ffc164eefd0 and A: 0x7ffc164eefd0 // again, address of A and B = address of D
C: 0x7ffc164eefd8 and A: 0x7ffc164eefd0 // A has the same address as before (common instance)
Ist der folgende Code korrekt?
Es gibt hier keinen Grund zu verwenden reinterpret_cast
, noch mehr, es führt zu undefiniertem Verhalten. Verwenden Sie static_cast
stattdessen:
A* pA = static_cast<A*>(pB);
Beide Darsteller verhalten sich in diesem Beispiel unterschiedlich. Der reinterpret_cast
wird pB
als Zeiger auf neu interpretiert A
, aber der Zeiger pA
kann auf eine andere Adresse zeigen, wie im obigen Beispiel (C vs A). Der Zeiger wird bei Verwendung korrekt hochgesendet static_cast
.
reinterpret_cast
mit Klassen ist immer faul (außer von Klasse zuvoid*
und zurück zur gleichen Klasse).