Heim > Backend-Entwicklung > C++ > Warum ist die implizite Konvertierung von „Child' zu „Base' bei der C-Vererbung verboten?

Warum ist die implizite Konvertierung von „Child' zu „Base' bei der C-Vererbung verboten?

DDD
Freigeben: 2024-10-28 16:10:28
Original
422 Leute haben es durchsucht

 Why is Implicit Conversion from `Child` to `Base` Forbidden in C   Inheritance?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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.

  • Virtuelle Vererbung: Bei der virtuellen Vererbung erbt eine Klasse von mehreren übergeordneten Klassen Klassen über eine einzelne Kopie des Basisklassenobjekts. Dies kann verwendet werden, um polymorphes Verhalten ohne die oben genannten Konvertierungsprobleme zu erreichen.
  • Brückenklassen: Man kann eine Zwischenklasse definieren, die öffentlich sowohl von Base als auch von Child erbt und als Brücke zwischen ihnen dient zwei. Dies ermöglicht eine explizite und kontrollierte Umwandlung zwischen den verschiedenen Zeigertypen unter Wahrung der Typsicherheit.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage