Zeiger-zu-Zeiger-Konvertierung in der Vererbungshierarchie
Betrachten Sie den folgenden C-Code:
<code class="cpp">class Base { }; class Child : public Base { }; int main() { Child *c = new Child(); Base *b = c; // Allowed Child **cc = &c; Base **bb = cc; // Error: Conversion not allowed }</code>
Begründung für die Konvertierungsbeschränkung
Der Compilerfehler in der letzten Zeile verdeutlicht die Einschränkung der impliziten Konvertierung von Child** zu Base**. Diese Einschränkung dient der Aufrechterhaltung der Typensicherheit.
Wenn diese Konvertierung zulässig wäre, könnte dies möglicherweise zu unerwarteten und fehlerhaften Situationen führen. Man könnte zum Beispiel schreiben:
<code class="cpp">*bb = new Base;</code>
Dies würde eine Instanz von Base erstellen und ihre Adresse in bb speichern, wodurch die ursprüngliche Child*-Referenz, auf die c zeigt, effektiv überschrieben wird. Dies könnte zu Datenbeschädigung und unvorhersehbarem Programmverhalten führen.
Alternativen für die implizite Konvertierung
Obwohl es keine direkte Möglichkeit gibt, Child** implizit in Base** umzuwandeln, ohne dies zu tun Basierend auf C-style oder reinterpret_cast gibt es alternative Ansätze, um die gewünschte Funktionalität zu erreichen und gleichzeitig die Typsicherheit zu wahren.
Das obige ist der detaillierte Inhalt vonWarum ist die implizite Konvertierung von „Child' zu „Base' bei der C-Vererbung verboten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!