die Frage: Ist es möglich, einen Zeiger (Referenz) bis C in den Zeiger (Referenz) zur Klasse A.
nicht konvertiert, es sei denn die Klassen polymorph sind d.h. mindestens eine Funktion virtuellen Element aufweisen. In diesem Fall kann dynamic_cast für die Nebenbesetzung verwendet werden, wie in StoryTellers Antwort gezeigt.
Wenn jedoch dieser Zeiger (Referenz) C
auf ein Kind verweist, das A
erbt, können Sie zuerst auf diesen untergeordneten Zeiger und dann auf A
verweisen.
c1 c;
C& cref = c;
A& aref = static_cast<c1&>(cref);
Das ist natürlich nicht unbedingt ideal, weil Sie nicht nur jeden beliebigen C
Zeiger, dessen Betontypen ist unbekannt umwandeln können.
Ich verstehe, dass beste Lösung von A nur Klasse C
zu machen ist, geerbt Wenn Sie dies getan hat, dann werden alle C
Zeiger würde A
Zeiger implizit konvertierbar sein.
aber immer noch kann es einige Probleme mit der Klasse a1 (zwei Basis A) verursachen.
Um die Probleme zu umgehen, benötigen Sie gemeinsame Basen, z. B. virtuelle Vererbung.
struct A {}; // abstract
struct B : virtual A {}; // abstract
struct C : virtual A {}; // abstract
struct a1 : B, C {}; // indirect inheritance of A
struct c1 : C {};
int main() {
c1 c;
C& cref = c;
A& aref = cref;
}
C und A sind völlig unabhängig, also nein, man kann nicht zwischen dem 2 mit einem statischen Guss konvertieren.Möglicherweise können Sie einen Konvertierungsoperator für sie erstellen (oder Sie könnten einfach nur neu entwerfen). – UKMonkey