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, Bund Csind jeweils mit ihren jeweiligen Instanz instanziiert A. Es wäre jedoch kein Problem, wenn die Instanz von Ddieselbe Adresse wie ihre Instanz Bund ihre jeweilige Instanz von hätte A. Obwohl dies nicht erforderlich ist, geschieht genau dies beim Kompilieren mit clang 11und 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 virtualFunktionsbezeichners wird normalerweise verwendet, um mehrdeutige Funktionsaufrufe zu vermeiden. Daher müssen bei Verwendung der virtualVererbung sowohl Bals auch CInstanzen eine gemeinsame AInstanz erstellen . Beim Instanziieren erhalten Dwir 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_caststattdessen:
A* pA = static_cast<A*>(pB);
Beide Darsteller verhalten sich in diesem Beispiel unterschiedlich. Der reinterpret_castwird pBals Zeiger auf neu interpretiert A, aber der Zeiger pAkann auf eine andere Adresse zeigen, wie im obigen Beispiel (C vs A). Der Zeiger wird bei Verwendung korrekt hochgesendet static_cast.
reinterpret_castmit Klassen ist immer faul (außer von Klasse zuvoid*und zurück zur gleichen Klasse).